2017-09-05 21 views
0

假設我有一個消息隊列,例如std::deque<std::vector<uint8_t>>() 我做了一個poll()(或選擇),並知道套接字已準備好寫入。Poco :: StreamSocket:檢測發送失敗

我做的:

const auto& message = _messageQueue.front(); 
_socket.sendBytes(message.data(), message.size()); 
_messageQueue.pop_front(); 

例如,我可以做到這一點字節發送的斷言是一樣的消息大小,但波索單證說StreamSocket :: sendBytes()

Returns the number of bytes sent, which may be less than the number of bytes specified. 

Poco文檔也沒有說什麼實際上setBlocking()方法。它是否阻塞,直到收到ACK數據包,並引發套接字錯誤?

+0

請閱讀此處:[阻止vs非阻塞套接字](http://www.scottklement.com/rpg/socktut/nonblocking.html)。 –

回答

0

例如,我可以做到這一點發送字節是一樣的消息大小的斷言,但波索單證說StreamSocket::sendBytes()

返回發送的字節數,其可以是小於的數量指定的字節。

這隻在非阻塞模式下才是正確的。在阻塞模式下,除非出現錯誤,否則我會在返回之前傳輸所有字節。這由Posix定義,而不是由Poco定義。如果在這裏有一個實際的問題,我看不到它。

Poco文檔也沒有說什麼實際上setBlocking()方法。在接收到ACK數據包之前它是否阻塞?

號它導致將來讀取要阻塞,直到有數據或EOS或錯誤,並寫入blockuntil複製到套接字發送緩衝器中的數據hasbeen。