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