Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[6858] 안녕하세요 소켓통신을 이용한 채팅방만들기와 채팅하기 소스분석좀 도와주세요!ㅠㅠ
C++입문자 [flclzkffps] 5992 읽음    2013-12-16 02:05
안녕하세요 이번 학교에서 기말고사로 소스코드분석을 하는데요 ㅠㅠ 고수님들
시간이나신다면.. 주석조금씩만 달아주실수 있을까요 ㅠㅠ 소켓통신을 이용한 채팅방인데 기능들이 서버에 방을만들어달라고 요청하고
방을 만들어주면 들어가서 채팅을 하는 그런방식인데 잘몰라서 주석을 못달겟습니다 ㅠㅠ 부탁드립니다!



#include "ClientGUI.h"

#include <stdio.h>
#include <process.h>

#define MSG_CHAT            1
#define MSG_ROOM_MAKE        2
#define MSG_ROOM_JOIN        3
#define MSG_ROOM_EXIT        4
#define MSG_ROOM_ADD        5
#define MSG_ROOM_CHG        6

typedef struct
{
    SOCKET* ClientSocket;
    SOCKADDR_IN* ServerAddress;   

    BOOL Run;
} SOCKET_THREAD_PARAM;

HWND zInput, zOutput, zRoomTitle, zRoomList;
WSADATA mSocket;
SOCKET mClientSocket;
SOCKET_THREAD_PARAM mParam;

void my_printf(char* format, ...)
{
    va_list arg;
    va_start(arg, format);

    char mBuffer[1024];
    vsprintf(mBuffer, format, arg);

    int mLength = GetWindowTextLength(zOutput);
    SendMessage(zOutput, EM_SETSEL, mLength, mLength);
    SendMessage(zOutput, EM_REPLACESEL, FALSE, (LPARAM) mBuffer);

    va_end(arg);
}

unsigned int __stdcall ThreadProcedure(LPVOID pParam)
{
    SOCKET_THREAD_PARAM* mParam = (SOCKET_THREAD_PARAM *) pParam;
    SOCKET mClientSocket = *(mParam->ClientSocket);
   
    int mResult, mType, mSize;
    char mBuffer[256];

    while(mParam->Run)
    {
        mResult = recv(mClientSocket, mBuffer, sizeof(int), 0);
        if(mResult == SOCKET_ERROR)
        {
            my_printf("recv(type) fail\n");
            break;
        }

        int* mTemp = (int*) mBuffer;
        mType = ntohl(*mTemp);

        mResult = recv(mClientSocket, mBuffer, sizeof(int), 0);
        if(mResult == SOCKET_ERROR)
        {
            my_printf("recv(size) fail\n");
            break;
        }

        mTemp = (int*) mBuffer;
        mSize = ntohl(*mTemp);

        mResult = recv(mClientSocket, mBuffer, mSize, 0);
        if(mResult == SOCKET_ERROR)
        {
            my_printf("recv() fail\n");
            break;
        }
        else if(mResult == 0)
            break;

        mBuffer[mResult] = '\0';

        switch(mType)
        {
        case MSG_CHAT:
            my_printf("%s\n", mBuffer);
            break;

        case MSG_ROOM_CHG:
            SendMessage(zRoomTitle, WM_SETTEXT, 0, (LPARAM) mBuffer);
            break;

        case MSG_ROOM_ADD:
            SendMessage(zRoomList, LB_ADDSTRING, 0, (LPARAM) mBuffer);
            break;
        }
    }

    return 0;
}

BOOL CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_INITDIALOG:
        zInput = GetDlgItem(hDlg, IDC_INPUT);
        zOutput = GetDlgItem(hDlg, IDC_OUTPUT);
        zRoomTitle = GetDlgItem(hDlg, IDC_ROOM_TITLE);
        zRoomList = GetDlgItem(hDlg, IDC_ROOM_LIST);

        SetDlgItemText(hDlg, IDC_NICKNAME, "이름없음");

        SendMessage(zInput, EM_SETLIMITTEXT, 64, 0);

        int mResult;
       
        if(WSAStartup(MAKEWORD(2, 2), &mSocket) != 0)
            return 1;

        mClientSocket = socket(AF_INET, SOCK_STREAM, 0);
        if(mClientSocket == INVALID_SOCKET)
        {
            my_printf("socket() fail\n");
            return 1;
        }

        SOCKADDR_IN mServerAddress;
        ZeroMemory(&mServerAddress, sizeof(mServerAddress));

        mServerAddress.sin_family = AF_INET;
        mServerAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
        mServerAddress.sin_port = htons(7337);

        mResult = connect(mClientSocket, (SOCKADDR *) &mServerAddress, sizeof(mServerAddress));
        if(mResult == SOCKET_ERROR)
        {
            my_printf("connect() fail\n");
            return 1;
        }

        mParam.ClientSocket = &mClientSocket;
        mParam.ServerAddress = &mServerAddress;
        mParam.Run = TRUE;

        _beginthreadex(NULL, NULL, ThreadProcedure, &mParam, NULL, NULL);

        return TRUE;

    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case IDOK:
            {
                int mType, mSize;
                char mName[32];
                char mMsg[128];
                char mBuffer[128];

                GetDlgItemText(hDlg, IDC_NICKNAME, mName, 32);
                GetDlgItemText(hDlg, IDC_INPUT, mBuffer, 64);

                sprintf(mMsg, "[%s] %s", mName, mBuffer);

                mType = htonl(MSG_CHAT);
                mResult = send(mClientSocket, (char*) &mType, sizeof(int), 0);
                if(mResult == SOCKET_ERROR)
                {
                    printf("send(type) fail\n");
                    break;
                }

                mSize = htonl(strlen(mMsg));
                mResult = send(mClientSocket, (char*) &mSize, sizeof(int), 0);
                if(mResult == SOCKET_ERROR)
                {
                    printf("send(size) fail\n");
                    break;
                }

                mResult = send(mClientSocket, mMsg, strlen(mMsg), 0);
                if(mResult == SOCKET_ERROR)
                {
                    my_printf("send() fail\n");
                    break;
                }

                SetDlgItemText(hDlg, IDC_INPUT, "");
            }
            return TRUE;

        case IDCANCEL:
            closesocket(mClientSocket);
            WSACleanup();

            EndDialog(hDlg, IDCANCEL);
            return TRUE;

        case IDC_ROOM_MAKE:
            {
                int mType, mSize;
                char mTitle[32];

                GetDlgItemText(hDlg, IDC_TITLE, mTitle, 32);

                mType = htonl(MSG_ROOM_MAKE);
                mResult = send(mClientSocket, (char*) &mType, sizeof(int), 0);
                if(mResult == SOCKET_ERROR)
                {
                    printf("send(type) fail\n");
                    break;
                }

                mSize = htonl(strlen(mTitle));
                mResult = send(mClientSocket, (char*) &mSize, sizeof(int), 0);
                if(mResult == SOCKET_ERROR)
                {
                    printf("send(size) fail\n");
                    break;
                }

                mResult = send(mClientSocket, mTitle, strlen(mTitle), 0);
                if(mResult == SOCKET_ERROR)
                {
                    my_printf("send() fail\n");
                    break;
                }

                SetDlgItemText(hDlg, IDC_TITLE, "");
            }
            return TRUE;

        default:
            switch(LOWORD(wParam))
            {
            case IDC_ROOM_LIST:
                if(HIWORD(wParam) == LBN_DBLCLK)
                {
                    int mType, mSize;
                    char mTitle[32];

                    int mIndex = SendMessage(zRoomList, LB_GETCURSEL, 0, 0);
                    SendMessage(zRoomList, LB_GETTEXT, mIndex, (LPARAM) mTitle);

                    if(strlen(mTitle))
                    {
                        mType = htonl(MSG_ROOM_CHG);
                        mResult = send(mClientSocket, (char*) &mType, sizeof(int), 0);
                        if(mResult == SOCKET_ERROR)
                        {
                            printf("send(type) fail\n");
                            break;
                        }

                        mSize = htonl(strlen(mTitle));
                        mResult = send(mClientSocket, (char*) &mSize, sizeof(int), 0);
                        if(mResult == SOCKET_ERROR)
                        {
                            printf("send(size) fail\n");
                            break;
                        }

                        mResult = send(mClientSocket, mTitle, strlen(mTitle), 0);
                        if(mResult == SOCKET_ERROR)
                        {
                            my_printf("send() fail\n");
                            break;
                        }
                    }
                }
                return TRUE;
            }
            break;
        }   

        return FALSE;
    }

    return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_CHAT), NULL, DlgProc);
}

+ -

관련 글 리스트
6858 안녕하세요 소켓통신을 이용한 채팅방만들기와 채팅하기 소스분석좀 도와주세요!ㅠㅠ C++입문자 5992 2013/12/16
6887     Re:안녕하세요 소켓통신을 이용한 채팅방만들기와 채팅하기 소스분석좀 도와주세요!ㅠㅠ ㅁㅁㅁ 2120 2014/07/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.