Linux, Sockets, nicht blockierende Verbindung

9

Ich möchte eine nicht blockierende Verbindung erstellen. So:

%Vor%

Dafür benutze ich einen anderen Thread, eine Endlosschleife und Linux epoll. So (Pseudocode):

%Vor%

Wenn ich einen Server und dann einen Client starte, funktioniert alles. Wenn ich zuerst einen Client ausführe, warte eine kurze Zeit, führe einen Server aus, dann verbindet sich der Client nicht.

Was mache ich falsch? Vielleicht kann es anders gemacht werden?

    
herolover 21.07.2013, 07:14
quelle

1 Antwort

28

Sie sollten die folgenden Schritte für eine asynchrone Verbindung verwenden:

  • erstellt Socket mit socket(..., SOCK_NONBLOCK, ...)
  • Verbindung mit connect(fd, ...) starten
  • wenn Rückgabewert weder 0 noch EINPROGRESS ist, dann Abbruch mit Fehler
  • warte bis fd als Ausgabebereit gemeldet ist
  • überprüfe den Status des Sockets mit getsockopt(fd, SOL_SOCKET, SO_ERROR, ...)
  • erledigt

Keine Schleifen - außer Sie möchten EINTR behandeln.

Wenn der Client zuerst gestartet wird, sollte im letzten Schritt der Fehler ECONNREFUSED angezeigt werden. Schließen Sie in diesem Fall den Socket und beginnen Sie von vorne.

Es ist schwierig zu sagen, was mit Ihrem Code nicht stimmt, ohne weitere Details zu sehen. Ich nehme an, dass Sie bei Fehlern in Ihrer Operation check_socket nicht abbrechen.

    
nosid 21.07.2013, 08:39
quelle

Tags und Links