Setting Socket Timeout?

后端 未结 3 811
北海茫月
北海茫月 2021-01-18 09:13

Using sockets, I am not sure how to set the timeout?

thanks

int sock, connected, bytes_recieved;
char send_data [128] , recv_data[128];       
SOCKAD         


        
相关标签:
3条回答
  • 2021-01-18 09:27

    you can use:

    fd_set fd;
    timeval tv;
    FD_ZERO(&fd);
    FD_SET(sock, &fd);
    tv.tv_sec = time_out(second);
    tv.tv_usec = 0;
    

    to set timeout for sending,receiving data.

    0 讨论(0)
  • 2021-01-18 09:39

    A socket is in blocking mode by default. If you switch it to non-blocking mode using ioctlsocket(FIONBIO), you can use select() to manage timeouts:

    SOCKET sock, connected;
    int bytes_recieved;  
    char send_data [128] , recv_data[128];         
    SOCKADDR_IN server_addr,client_addr;      
    int sin_size;  
    int j = 0, ret;  
    fd_set fd;
    timeval tv;
    
    sock = ::socket(AF_INET, SOCK_STREAM, 0);  
    
    server_addr.sin_family = AF_INET;           
    server_addr.sin_port = htons(4000);       
    server_addr.sin_addr.s_addr = INADDR_ANY;   
    
    ::bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));  
    ::listen(sock, 1);  
    ::fflush(stdout);  
    
    u_long nbio = 1;
    ::ioctlsocket(sock, FIONBIO, &nbio);
    
    while(1) 
    {   
        FD_ZERO(&fd);
        FD_SET(sock, &fd);
    
        tv.tv_sec = 5;
        tv.tv_usec = 0;
    
        if (select(0, &fd, NULL, NULL, &tv) > 0)
        {
            sin_size = sizeof(struct sockaddr_in); 
            connected = ::accept(sock, (struct sockaddr *)&client_addr, &sin_size); 
    
            nbio = 1;
            ::ioctlsocket(connected, FIONBIO, &nbio);
    
            while (1) 
            { 
                j++; 
    
                if (::send(connected, send_data, strlen(send_data), 0) < 0)
                {
                    //dealing with lost communication ?  
                    //and reastablishing communication 
                    //set timeout and reset on timeout error     
    
                    if (WSAGetLastError() == WSAEWOULDBLOCK)
                    {
                        FD_ZERO(&fd);
                        FD_SET(connected, &fd);
    
                        tv.tv_sec = 5;
                        tv.tv_usec = 0;
    
                        if (select(0, NULL, &fd, NULL, &tv) > 0)
                            continue;
                    }
    
                    break;
                }
            } 
    
            closesocket(connected);
        } 
    }
    
    0 讨论(0)
  • 2021-01-18 09:42

    You need to use setsockopt to set the SO_SNDTIMEO and/or SO_RCVTIMEO options.

    0 讨论(0)
提交回复
热议问题