소켓프로그래밍 채팅 프로그램
소켓 프로그래밍의 여러 방식을 사용하는 채팅 서버와 클라이언트를 구현한다.
로비를 통해 채팅방을 생성하거나 대화에 참여합니다.
1. 블록소켓 UDP
2. 블록소켓 TCP
3. 논블록소켓 UDP
4. 논블록소켓 TCP
5. Overllapped I/O
6. IOCP
Client , Server : TCP/IP 소켓을 사용하는 채팅 클라이언트/서버
ChatPacket : 메세지, 호스트 정보 전달 등을 위해 페킷을 형식화
- 문제 : 수신완료 이벤트들의 완료를 기다리는 중에 새로 추간된 수신 이벤트를 대기 이벤트열에 추가하고 싶다.
- 해결 : Alertable Wait 상태를 바꾸기 위하여 이벤트열중 첫번째 이벤트를 임의로 변화를 나타내는 이벤트로 설정하여 새 연결이 만들어 지는 경우 이벤트에 신호를 줘 이벤트가 추가됨을 알렸다.
OverlappedServ::Run() 함수 일부
accp_sock = accept(serv_sock_, (SOCKADDR*)& clnt_addr, &addrlen);
...
WSASetEvent(num_changed_event_);
OverlappedServ::Chat() 함수 일부
DWORD wait_result = WSAWaitForMultipleEvents(sock_num_, events_, FALSE, WSA_INFINITE, true);
int index = wait_result - WSA_WAIT_EVENT_0;
if (index == 0)
{
WSAResetEvent(num_changed_event_);
continue;
}