2014-10-08 35 views
1

我有一個套接字,我爲recv()設置了一個超時時間。 我有兩個步驟recv(),首先我檢查收到的數據的內容是否完整,使用MSG_PEEK | MSG_DONTWAITrecv(MSG_PEEK)timeout

recvTimeout.tv_sec = mRecvTimeoutSecs; 
recvTimeout.tv_usec = mRecvTimeoutUSecs; 
sendTimeout.tv_sec = mSendTimeoutSecs; 
sendTimeout.tv_usec = mSendTimeoutUSecs; 

result = enableSocketOption(SOL_SOCKET, SO_RCVTIMEO, &recvTimeout, sizeof(recvTimeout)); 

peekdLen = ::recv(mSocket, peekDataBuffer, MAX_RECV_LENGTH, MSG_PEEK | MSG_DONTWAIT); 

我只是想,如果,如果我用MSG_PEEK | MSG_DONTWAITrecv()會超時。

回答

1

不,套接字不會超時,因爲MSG_DONTWAIT將導致recv()立即返回。請注意,如果設置爲1毫秒超時,那麼它可能會超時 - 這取決於實現(您的代碼在哪個操作系統上運行)。

+0

如果我刪除'MSG_DONTWAIT'標誌..它會在:: recv(MSG_PEEK)超時? – 2014-10-08 09:20:20

+0

是的。 「MSG_PEEK」所做的一切就是它不會將接收到的數據標記爲已讀 - 因此,除非數據未從套接字中移出,否則與沒有它的情況下的行爲沒有區別。所以是的,如果套接字中沒有數據,它將等待一些到達。請參閱[文檔](http://pubs.opengroup.org/onlinepubs/009695399/functions/recv.html)。你也可以自己嘗試 - 打開一個套接字,連接它並嘗試超時和不使用時(不需要創建另一個線程或任何東西,只需在代碼上方打開一個套接字並連接到「127.0.0.1」 )。 – 2014-10-08 09:25:13

+0

啊,我需要recv()超時,所以我會刪除'MSG_DONTWAIT'。謝謝! :) – 2014-10-08 09:31:27