Select()의 시간 초과 옵션을 NULL로 설정하여 문제가 완전히 해결되었다고 말하면서 머리말을 붙이고 싶습니다.Winsock - Listening 소켓에서 선택 시간 초과로 인해 모든 후속 Select 호출이 실패 함
하지만 시간 제한을 사용하고 싶습니다. 여기 내 문제가 있습니다. 서버 프로그램은 매우 단순한 &이며, 연결을 청취하고이를 받아 들여 콘솔에 인쇄합니다.
문제는 select의 첫 번째 시간 초과 후 select가 -1을 반환한다는 것입니다. MSDN은 select()에서 -1이 반환 될 것이라는 점에 대해 거의 알려주지 않고 오류 만 표시합니다. 신호)를 차단하고 프로그램에서 더 이상 통신을 중단합니다.
서버 - 방법 선택()가 작동하는데, 어떻게 내 클라이언트에서 작동합니다 그게 전부 때문에 MAIN.CPP
int main(){
/* variables */
int iResult, iSendResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
bool exit=false;
int foundRoom, tempFoundRoom;
fd_set readfds, writefds;
struct timeval tv;
long double counter=0;
int maxfd=0;
/* Server variables */
WSADATA wsaData;
SOCKET ListenSocket = INVALID_SOCKET;
SOCKET ClientSocket = INVALID_SOCKET;
struct addrinfo *result = NULL;
struct addrinfo hints;
printf("~SERVER~\n");
/* Initialize Winsock*/
initialize_winsock(wsaData, hints, &result);
/* Set socket and bind to TCP listening socket */
set_socketandbind(ListenSocket, result, maxfd);
//non-blocking mode
u_long iMode=1;
ioctlsocket(ListenSocket,FIONBIO,&iMode);
ioctlsocket(ClientSocket,FIONBIO,&iMode);
// clear the set ahead of time
FD_ZERO(&readfds);
//FD_ZERO(&writefds);
//add our descriptors to the set
FD_SET(ListenSocket, &readfds);
//wait until either socket has data ready to be recv()d (timeout 5 secs)
tv.tv_sec = 5;
tv.tv_usec = 0;
/* main loop */
for(;;){
cout << "Maxfd: " << ListenSocket << " \ " << maxfd << endl;
//select
int rv = select(ListenSocket+1, &readfds, NULL, NULL, &tv);
cout << "Updateing... rv: " << rv << endl;
if (rv == -1) {
perror("Select: "); // error occurred in select()
}else if (rv == 0){
printf("Timeout occurred! No data after 5 seconds.\n");
}else{
// one or both of the descriptors have data
if (FD_ISSET(ListenSocket, &readfds)) {
// Accept a client socket
ClientSocket=accept(ListenSocket, NULL, NULL);
cout << "Connected a user." << endl;
}
counter++;
}
cout << endl;
Sleep(500);
};
/* Unset server socket */
closesocket(ListenSocket);
system("pause");
return 0;
}
출력은해야한다, 시간 제한, 시간 제한, 시간 제한,. 당신은 'TV'와 FD 구조 루프 주위 때마다 재설정해야
select()를 호출 할 때마다 TV 구조가 다시 설정된다는 것을 의미합니까? –
이것은 실제로 문제를 해결하지 못합니다. FD_ZERO 및 FD_SET을 추가하고 루프에서 tv를 재설정해야하며 모든 루프를 추가 할 필요가 없습니다. 왜 이런거야? –
select()는 FD 구조를 변경하기 때문입니다. 시간 제한이있는 경우 아무 것도 준비되지 않았으므로 해당 비트가 지워졌으므로 재설정해야했습니다. – EJP