스레드 공부하는 초보자 인데요
글쓴이: 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:


댓글 달기