2017-09-05 2 views
0

Sagen wir, ich habe eine Nachrichtenwarteschlange, z. std::deque<std::vector<uint8_t>>() Ich habe eine poll() (oder wählen Sie), und wissen, dass der Sockel zum Schreiben bereit ist.Poco :: StreamSocket: erkennen Senden fehlgeschlagen

ich tun:

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

Zum Beispiel kann ich eine Aussage machen, die die gleiche gesendeten Bytes als Nachrichtengröße ist, aber Poco Dokumentationen sagt, dass StreamSocket :: sendBytes()

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

Poco Dokumentation sagt auch nichts, was eigentlich setBlocking() Methode tut. Blockiert es bis ACK-Paket empfangen und wirft Socket-Fehler?

+0

Lesen Sie hier: [Blockieren vs. nicht blockierende Sockets] (http://www.scottklement.com/rpg/socktut/nonblocking.html). –

Antwort

0

Beispiel kann ich eine Aussage machen, die die gleiche wie die Nachrichtengröße gesendeten Bytes, aber Poco Dokumentationen sagen, dass StreamSocket::sendBytes()

die Anzahl von Bytes Kosten gesendet, die als die Zahl geringer sein können Bytes angegeben.

Dies ist nur im nicht blockierenden Modus korrekt. Im Blockiermodus überträgt I t alle Bytes, bevor es zurückkehrt, es sei denn, es liegt ein Fehler vor. Dies wird von Posix definiert, nicht von Poco. Wenn es hier eine Frage gibt, kann ich sie nicht sehen.

Poco Dokumentation sagt auch nichts was eigentlich setBlocking() Methode tut. Blockiert es, bis das ACK-Paket empfangen wurde?

Nein, es Zukunft führt liest zu blockieren, bis es Daten oder EOS oder ein Fehler ist, und schreibt die Daten hasbeen in die Buchse Sendepuffer kopiert blockuntil.