숙제는 아무도 안해줘요; 불문율;
C++입문자 님이 쓰신 글 :
: 안녕하세요 이번 학교에서 기말고사로 소스코드분석을 하는데요 ㅠㅠ 고수님들
: 시간이나신다면.. 주석조금씩만 달아주실수 있을까요 ㅠㅠ 소켓통신을 이용한 채팅방인데 기능들이 서버에 방을만들어달라고 요청하고
: 방을 만들어주면 들어가서 채팅을 하는 그런방식인데 잘몰라서 주석을 못달겟습니다 ㅠㅠ 부탁드립니다!
:
:
:
: #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);
: }
|