나는 clients
과 연결되어있는 SOCKET
2 개의 연결을 가진 server
을 가지고 있으며,이 메시지를 보내거나받을 때 멈추지 않는 비 차단 모드 인 server
을 설정합니다. 나는 각 연결의 SOCKET
시간을 설정하려면,하지만 난 다음 코드를 사용하는 경우 :비 차단 모드 서버의 클라이언트로부터 메시지를 수신하는 시간 제한을 설정하는 방법은 무엇입니까?
void getMessage(SOCKET connectedSocket, int time){
string error = R_ERROR;
// Using select in winsock
fd_set set;
timeval tm;
FD_ZERO(&set);
FD_SET(connectedSocket, &set);
tm.tv_sec = time; // time
tm.tv_usec = 0; // 0 millis
switch (select(connectedSocket, &set, 0, 0, &tm))
{
case 0:
// timeout
this->disconnect();
break;
case 1:
// Can recieve some data here
return this->recvMessage();
break;
default:
// error - handle appropriately.
break;
}
return error;
}
내 서버가 없습니다 더 이상 모드 것도 차단하지 않습니다! 두 번째 연결에서 메시지를 가져 오는 첫 번째 연결 종료 시간까지 기다려야합니다! 그건 내가 기대하는 것이 아니야! 그럼, 비 블로킹 모드에서 타임 아웃을 설정하는 방법이 있습니까? 아니면 직접 처리해야합니까?
두 소켓 모두에서'select'를하도록 코드를 리팩토링해야 할 수도 있습니다. 그리고'select'가 어떤 소켓이 준비되어 있는지 체크 아웃하지 않는다면 (둘 다 가능함을 기억하십시오) 적절한 receive 메소드를 호출하십시오 . 요아킴이 한 말에 +1 –
+1. 핵심 서버 루프는 모든 소켓에서 select()를 호출해야하며 각 소켓과 연관된 객체 (클래스 인스턴스)를가집니다. 각 클래스 인스턴스의 "Read"메소드는 각 소켓에서 가능한 한 많이 읽고 처리 할 수있는 것을 처리합니다. 아마도 "비동 사적으로"보내는 것일 수도 있습니다. – selbie
두 개의 서로 다른 스레드가 있으므로 논 블로킹 입출력을 선택하지 않아도됩니다. 각 스레드가 I/O를 차단하도록하십시오. recv에서 시간 초과가 필요하면 [this solution] (http://stackoverflow.com/questions/2876024/linux-is-here-a-read-or-recv-from-socket-with-timeout)을 사용하십시오. – jxh