2016-12-01 16 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 
    } 
} 
関連する問題