1
我有一個套接字,我爲recv()
設置了一個超時時間。 我有兩個步驟recv()
,首先我檢查收到的數據的內容是否完整,使用MSG_PEEK | MSG_DONTWAIT
。recv(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_DONTWAIT
recv()
會超時。
如果我刪除'MSG_DONTWAIT'標誌..它會在:: recv(MSG_PEEK)超時? – 2014-10-08 09:20:20
是的。 「MSG_PEEK」所做的一切就是它不會將接收到的數據標記爲已讀 - 因此,除非數據未從套接字中移出,否則與沒有它的情況下的行爲沒有區別。所以是的,如果套接字中沒有數據,它將等待一些到達。請參閱[文檔](http://pubs.opengroup.org/onlinepubs/009695399/functions/recv.html)。你也可以自己嘗試 - 打開一個套接字,連接它並嘗試超時和不使用時(不需要創建另一個線程或任何東西,只需在代碼上方打開一個套接字並連接到「127.0.0.1」 )。 – 2014-10-08 09:25:13
啊,我需要recv()超時,所以我會刪除'MSG_DONTWAIT'。謝謝! :) – 2014-10-08 09:31:27