스레드 공부하는 초보자 인데요
글쓴이: ck7683 / 작성시간: 화, 2014/12/23 - 3:36오후
안녕하세요
제가 스레드에 대한 질문이 있는데요.
예전에 수업 들으면서 MFC를 응용하여 채팅클라이언트/서버를 만들어 본 적이 있는데
기억을 되살릴겸 MFC를 쓰지 않으면서(콘솔화면) 채팅 클라이언트를 만들고자 하는데
처음에는 채팅 클라/서버를 만들고자 했지만 하다보니 목표가 바뀌어
스레드를 자유자재로 사용해보려고 합니다.
그런데 스레드간 통신을 공유메모리를 사용하지 않고 메세지를 통해서 전달해보려고 하는데
제가 어디서 잘못했는건지 스레드 두 개는 켜지는데
UINT WINAPI threadAccept(void* arg) 함수에서 PostMessage 함수를 사용하여 메세지를 전달하고자 하나
UINT WINAPI threadGetMessage(void* arg) 함수의 GetMessage에서 응답이 없습니다.
어떤 점이 잘못되어 메세지가 전달되지 않는 걸까요?
ps 질문 올리기 전에 사용 예제 같은 것을 찾아봤는데, 왠만하면 MFC 이더군요
혹시 빈 페이지에서 만들면 안되는건가?...
#include<stdio.h> #include<process.h> #include<WinSock2.h> #pragma comment(lib,"ws2_32.lib") #define ACCEPT_CLIENT WM_USER+1 #define MY_PORT (short)4000 #define MAX_CLIENT 10 struct threadArgs{ SOCKET *clientSocket; SOCKET listen; HANDLE messageHandler; }; UINT WINAPI threadGetMessage(void* arg){ BOOL bRet; MSG msg; memset(&msg, 0, sizeof(msg)); WPARAM wParam; printf("start threadGetMessage\n"); while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { printf("I get message\n"); if (bRet == -1) { return -1; } else { TranslateMessage(&msg); DispatchMessage(&msg); if(msg.message == ACCEPT_CLIENT){ printf("ACCEPT_CLIENT %d\n", (int)msg.wParam); } } } printf("stop threadGetMessage\n"); } UINT WINAPI threadAccept(void* arg){ printf("start threadAccept\n"); threadArgs *client = (threadArgs*)arg; PostMessage((HWND)client->messageHandler, ACCEPT_CLIENT, (WPARAM)1234, NULL); int n = 0; while(1){ for(int i = 0 ; i < MAX_CLIENT; i++) { SOCKET tempSock = accept(client->listen, NULL, NULL); if(tempSock == INVALID_SOCKET){ printf("accept() error in thread"); return -1; } if(client->clientSocket[i] == 0){ client->clientSocket[i] = tempSock; PostMessage((HWND)client->messageHandler, ACCEPT_CLIENT, (WPARAM)i, NULL); } } } return 0; } int main(void){ WORD wVersion = MAKEWORD(2,2); WSADATA wData; WSAStartup(wVersion, &wData); if(wData.wVersion != wVersion){ printf("버전 불일치"); return -1; } SOCKET listenSocket; listenSocket = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP); if(listenSocket == INVALID_SOCKET){ printf("listen Socket Error"); return -1; } SOCKADDR_IN sockAddr; sockAddr.sin_family = AF_INET; sockAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); sockAddr.sin_port = MY_PORT; if(bind(listenSocket, (LPSOCKADDR)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR){ printf("bind() 애러"); closesocket(listenSocket); return -1; } if(listen(listenSocket, SOMAXCONN) == SOCKET_ERROR){ printf("listen() 애러"); closesocket(listenSocket); } HANDLE messageHandler = (HANDLE)_beginthreadex( NULL, 0, threadGetMessage, (void*)NULL, 0, NULL); threadArgs acceptArg; SOCKET clientSocket[MAX_CLIENT] = {0}; acceptArg.clientSocket = clientSocket; acceptArg.listen = listenSocket; acceptArg.messageHandler = messageHandler; HANDLE acceptThread = (HANDLE)_beginthreadex( NULL, 0, threadAccept, (void*)&acceptArg, 0, NULL); WaitForSingleObject(acceptThread, INFINITE); WSACleanup(); return 0; }
Forums:
댓글 달기