WSAEVENT handleMgr[2];
...
handleMgr[1]= WSACreateEvent();
ch = WSAEventSelect(hSocket,handleMgr[1],FD_READ |FD_CLOSE);
handleMgr[0] = GetStdHandle(STD_INPUT_HANDLE);
0번 표준입출력 1번 소켓 이벤트 핸들
...
ch = WaitForMultipleObjects(2,handleMgr,FALSE,0);
switch(ch){
case WAIT_OBJECT_0 + 1:
recvProc();
ResetEvent(handleMgr[1]);
break;
case WAIT_OBJECT_0 + 0:
if(processStdin()){
ch = getch();
sendProc(ch);
}
break;
}
2개의 핸들 대상으로 이벤트 객체 기다림.
발생한 이벤트가 표준 입력 핸들일때
char processStdin(void){
INPUT_RECORD record;
DWORD numRead;
if(!ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &record, 1, &numRead)){
return 0;
}
if(record.EventType != KEY_EVENT){
return 0;
}
if(record.Event.KeyEvent.bKeyDown){
return 1;
}
}
이 함수 이용해서 표준 입력 핸들에서 발생한 이벤트를 읽어서 이 이벤트가 키 입력 이벤트인지 확인
recvProc : 소켓에서 recv로 읽어서 라인 리스트에 넣고 라인 리스트 출력 업데이트함
sendProc : 내가 입력한 표준 입력을 getch로 읽어서 타이핑 배열에 추가함. 입력이 엔터일땐 여태까지 쓴 메세지를 서버로 send
내가 바라는 상황 : 내가 키 입력을 할 때는 getch로 입력한 만큼 입력을 읽어서 보내고,
외부에서 메세지가 왔을 때는 recv되는 채팅
발생하는 문제 : 클라이언트가 입력을 하고 나서는 다른 클라이언트의 메세지를 확인하려면 아무키나 눌러서 getch 봉쇄를 한번 풀어줘야함.
도움을 주세요
댓글 0