2017-12-10 5 views
1

私は私のブロッキングソケットのタイムアウトを設定している...場合(recv()== 0)は、切断またはタイムアウトを意味しますか? (ソケット、Linuxの&Windowsの場合)

DWORD to = 1200; 
if (setsockopt (soc, SOL_SOCKET, SO_RCVTIMEO, (char *)&to, sizeof(to))) { 
    ... 
} 

のrecv()はタイムアウトしどのように私はこれを言うことができるリンクが切断または読み込まれ、ゼロを返すこと?もしそれがt/oならもっと読んでみたい、それが嫌なら他の行動をしたい。私は単にt/oを取り除くことができたと気付きました。それから私はそれが矛盾であることを知っていましたが、読んでいるプロセスがどのように進行しているかを定期的に監視する必要もあります。

ご迷惑をおかけして申し訳ございません。乾杯 - socketのmanページのSO_RCVTIMEOセクションからリッチ

答えて

3

recvのmanページから:

These calls return the number of bytes received, or -1 if an error 
occurred. In the event of an error, errno is set to indicate the 
error. 

When a stream socket peer has performed an orderly shutdown, the 
return value will be 0 (the traditional "end-of-file" return). 

Datagram sockets in various domains (e.g., the UNIX and Internet 
domains) permit zero-length datagrams. When such a datagram is 
received, the return value is 0. 

The value 0 may also be returned if the requested number of bytes to 
receive from a stream socket was 0. 

recvの呼び出しが切断に0を返します、または長さゼロのデータグラムが受信された場合、または要求されたバイト数が0の場合

recvを呼び出すと、タイムアウトを含めてエラーが発生した場合、-1が返されます。タイムアウトとその他のエラーを区別するためには、errnoを調べる必要があります。

関連する問題