Hallo,
ich habe einen ESP8266 als Server und einen Client am Linux oder Windows
PC. U.U. kann es sein das die Verbindung verloren geht und ich möchte
einen "erneuten" Verbindungsaufbau versuchen. Auf Windows funktioniert
das ganze super. Nur auf Linux habe ich das Problem dass das Programm
abstürzt sobald connection_status gesetzt ist.
Weiß jemand von euch warum? Habe einen Server für Windows testweise
erstellt. Dieser ersetzt den ESP. Ich hänge beide Dateien an.
Vielen dank für eure Hilfe.
mfg
Umbrecht
Danke für deine Antwort, ich versuche es gleich. Aber warum funktioniert
der Client unter Windows? Er kann sich beliebig oft wieder verbinden,
der Server ist hierbei aber der gleiche.
Stored B. schrieb:> Er kann sich beliebig oft wieder verbinden,> der Server ist hierbei aber der gleiche.
die server_mc.c? Kann nicht sein. Darin wird nur einmal "accept"
ausgeführt, deshalb kann dieser Server auch nur eine TCP-Verbindung
bearbeiten.
(rein "entgegennehmen" kann er 5 (parameter zu listen), aber auf den
anderen sendet/empfängt er nix)
Εrnst B. schrieb:> die server_mc.c? Kann nicht sein. Darin wird nur einmal "accept"> ausgeführt, deshalb kann dieser Server auch nur eine TCP-Verbindung> bearbeiten.>> (rein "entgegennehmen" kann er 5 (parameter zu listen), aber auf den> anderen sendet/empfängt er nix)
Das stimmt natürlich, ich habe mich schlecht ausgedrückt, ich Simuliere
einen Verbindungsabbruch durch beenden des Servers und erneuten Starten
des Servers. Der Client auf Windows verbindet sich dann wieder. Der
Client auf Linux beendet sich sofort nachdem der Server beendet wird,
hier komme ich gar nicht dazu den Verbindungsaufbau erneut zu testen.
Stored B. schrieb:> Der> Client auf Linux beendet sich sofort nachdem der Server beendet wird,
Dann zeig doch mal die Ausgaben vom Programm, wenn das passiert.
Sind ja einige Debug-Prints vorhanden.
Der Fehler ist tatsächlich etwas fies zu finden, lustigerweise passiert
er schon bevor "connection_status" umgestellt wird.
Heute komme ich leider an keinen PC mehr, schicke morgen mal Screenshots
von der Konsole. Viel sieht man aber nicht, außer das typische Konsolen
eingabefeld, es kommt keine Fehlermeldung.
Dann muss der Auslöser eigentlich send oder recv sein. Habe ich
vielleicht etwas falsch konfiguriert?
Stored B. schrieb:> Dann muss der Auslöser eigentlich send oder recv sein.
Ja.
Beim send auf einen toten Socket kriegt dein Program ein SIGPIPE und der
send-Rückgabewert ist EPIPE. Rückgabewert prüfst du, aber nachdem das
SIGPIPE von dir weder behandelt noch weg-ignoriert wird, beendet sich
das Programm.
d.H. zwei Lösungsvorschläge:
"send" mit flag 'MSG_NOSIGNAL' aufrufen, also:
Ich muss sagen dass ich dieses Problem nicht kenne und noch nie den
Signalhandler SIGPIPE umgeleitet habe.
Jedoch frage ich über "select" stets zuerst ob ich den Socket lesen
kann. Dies wird signalisiert und beim lesen des Sockets bekomme ich den
Fehler, dass der Socket geschlossen wurde und kann darauf reagieren (den
Socket ebenfalls schließen und nicht weiter verwenden). So bin ich stets
ans Ziel gekommen ohne diesen Fehler je zu Gesicht zu bekommen.