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

C/C++ Q/A
[6887] Re:안녕하세요 소켓통신을 이용한 채팅방만들기와 채팅하기 소스분석좀 도와주세요!ㅠㅠ
ㅁㅁㅁ [] 2119 읽음    2014-07-24 20:19
숙제는 아무도 안해줘요; 불문율;


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);
: }

+ -

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