2016-12-01 56 views
1

如果發生阻塞,UDP套接字blocking on receive未收到任何數據,也不會收到任何數據,因爲發送方進程因某種原因已崩潰。 套接字選項SO_RCVTIMEO可以設置爲確保接收系統調用將返回,但是是否存在解決該問題的「已知方法」(因爲超時值不精確並且取決於系統,如果它是緩慢與否)如何防止接收套接字永久阻塞,以防接收到任何數據?

回答

2

您可以使用select函數來了解某個東西已準備好在套接字上讀取。

while (1) 
{ 
    int retval; 
    fd_set rfds; 
    // one second timeout 
    struct timeval tv = {1,0}; 

    FD_ZERO(&rfds); 
    FD_SET(fd, &rfds); 

    retval = select(1, &rfds, NULL, NULL, &tv); 

    if (retval == -1) 
    { 
     perror("select()"); 
     exit(1); 
    }   
    else if (retval) 
    { 
     printf("Data is available now.\n"); 
     // if recvfrom() is called here, it won't block 
    } 
    else 
    { 
     // no data to read... perform other tasks 
    } 
}