繁体   English   中英

Winsock-Select的侦听套接字超时导致随后的每个Select呼叫失败

[英]Winsock - Select's timeout on Listening socket causing every subsequent Select call to fail

我想以此开头我的问题,方法是将Select()的超时选项设置为NULL,从而完全解决了我的问题。

但是我想使用一个超时,所以这是我的问题。 服务器程序非常简单明了,它监听连接,接受连接并打印到控制台。

问题是在选择第一次超时后,选择将返回-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;
}

输出应该是timeout,timeout,timeout,因为那就是select()应该如何工作以及如何在我的客户端上工作。 而是输出超时,错误,错误,错误:

在此处输入图片说明

您需要在每次循环时重置“ TV”和FD结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM