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 봉쇄를 한번 풀어줘야함.


도움을 주세요