2016-05-20 3 views
1

Angenommen, ich habe einen Socket, den ich durch den Systemaufruf socket() erstellt habe. Danach habe ich einen connect() gemacht und angefangen, Daten zu senden und zu empfangen. ÄhnlichWenn send()/recv() fehlschlägt. Wo steht die Steckdose?

, auf der anderen Seite, eine Buchse mit dem socket() Systemaufruf erstellt wurde, und dann bind(), listen() und accept() genannt wurden. Dann begann diese Seite auch zu kommunizieren.

Nehmen wir an, einer der send() (und entsprechend recv() auf der anderen Seite) schlägt fehl.

Was ich möchte, wo würde diese Steckdose nach dem Scheitern stehen?

wieder zu kommunizieren, sollte ich die Fassung wieder schaffen und tun connect() (bind(), listen() und accept() auf der anderen Seite), oder ich kann send() und recv() erneut versuchen? Und was ist das Beste, was man in einem solchen Szenario tun kann?

HINWEIS: Wir wissen nicht, was der Grund für die recv()send()/ist zum Scheitern verurteilt. Es kann alles sein, von einem physischen Drahtbruch bis zur Ablehnung der anderen Seite (möglicherweise unter Verwendung von iptables).

Antwort

2

Was zu tun ist, hängt ganz davon ab, warum send oder recv fehlgeschlagen ist.

Wenn ein Fehler erkannt wird, überprüfen Sie den Wert errno, um den Grund zu ermitteln. Wenn der Fehlercode beispielsweise EAGAIN lautet, würden Sie die Operation erneut versuchen. Wenn der Fehlercode ECONNRESET lautet, müssen Sie die Verbindung erneut herstellen.

In den Manpages für send und recv finden Sie weitere Details darüber, welche Fehler zurückgegeben werden können und was Sie dagegen tun sollten.

+0

Dann würde eine Wiederherstellung von einem defekten Netzwerk zu einer Überprüfung aller Rückgabewerte und dann zu den entsprechenden Schritten führen? – Haris

+0

@Haris Der, den Sie wahrscheinlich überprüfen möchten, ist, wenn 'send' -1 zurückgibt und' errno' 'ECONNRESET' ist. Für jeden anderen Wert sollte es sicher sein, es erneut zu versuchen. – dbush

+0

Ok. Vielen Dank. Das hat geholfen. – Haris

Verwandte Themen