2017-07-26 10 views
0

ich mit meiner mbed-Controller ich kämpfen und es gewinnt:/ Teil meines Codes unter:mbed-Socket-Verbindung dauert lange

eth.connect(); 
pc.printf("ethernet OK"); 
sock.set_blocking(false,200); 
pc.printf(" socket setting OK "); 
sock.connect("192.168.1.100", 80); 
pc.printf("GO! GO! GO!"); 
conn = sock.is_connected(); 

Wenn der Server ist auf I mit Buchse verbinden kann und es kein Problem. Aber wenn ich meinen Server herunterfahre, wartet mein Programm lange in der sock.connect (...) Zeile und dann geht es weiter. Ich möchte, dass es vorwärts geht, aber ich möchte nicht so lange warten:/

Ich fand, dass ich Socket-Einstellung von Blockierung zu nicht blockierend ändern sollte, und Timeout von Standard = 1500 zu weniger. Habe ich es überall, wo ich konnte:
- Ein Teil meiner socket.h Bibliothek:
void set_blocking(bool blocking, unsigned int timeout=200);
- Teil meiner socket.cpp Bibliothek:
Socket::Socket() : _sock_fd(-1), _blocking(false), _timeout(200)
Und immer noch nichts. Es dauert ungefähr 17-18 Sekunden, aber ich möchte es auf max ändern. 1-2sek.

ich froh wäre, wenn Sie eine mir jeden Tipp geben :)

Antwort

0

Erstens muss ich sagen, dass TCP_SYNMAXRTX ändern ist etwas, was kann wirklich helfen, es hat mir geholfen, aber überhaupt nicht. In meinem Fall war es wichtig, mbed OS auf die neueste Version zu bringen. In der Vergangenheit gab es Bibliotheken mit Socket-Einstellungen, aber eigentlich funktionieren sie richtig, da mbed OS EthernetInterface und andere Bibliotheken enthält (Sie sollten es nicht als externe Bibliothek importieren).

Vielen Dank für Ihre Zeit und guten Willen! :)

0

Angenommen, Sie mbed OS verwenden, setzen Sie den Socket blockiert und den Timeout, was auch immer Sie denken, angemessen ist. Es sind keine Änderungen erforderlich. Die Methodensyntax ist zu sehen here.

Ich habe jedoch Probleme beim Reproduzieren Ihres Problems. Können Sie einen Debugger verwenden und bestätigen, ob die Anwendung an dieser Zeile hängt - https://github.com/ARMmbed/mbed-os/blob/533e6f0febb5ea582a61f0c8aaf686c70333524f/features/netsocket/TCPSocket.cpp#L57?

+0

Hallo Sarah :) Ich benutze andere Bibliothek - ich habe gerade EthernetInteface importiert und dort fand ich Socket und andere Dateien, aber das Copyright ist von 2012 und Quellcode sieht anders aus. Ist es eine andere Bibliothek, die ich herunterladen soll? Vielleicht ist es eine Art "nicht schlau" Frage, aber ich bin sehr neu in mbed Programmierung :) Sie fragen über TCPSocket.cpp, aber in EthernetInterface diese Datei existiert gar nicht, also nehme ich an, es sollte etwas anderes sein. Können Sie mir sagen, wonach ich suchen soll? Ich habe das frischste EthernetInterface hochgeladen, aber es ist immer noch dasselbe. –

+0

Nach der Bearbeitung: Ich benutze Socket von: https://developer.mbed.org/handbook/Socket und es ist eigentlich sehr analog. Ich habe versucht, es auf blocking = true, timeout = 200 und viele andere Kombinationen, aber immer noch nichts:/ –

+0

Wechseln Sie zu mbed OS 5. EthernetInterface ist dort enthalten. Die von Ihnen erwähnte EthernetInterface-Bibliothek wird nicht mehr unterstützt. Beginnen Sie mit dem Klonen von https://github.com/ARMmbed/mbed-o-example-blinky und fügen Sie dann denselben Code hinzu. Auf diese Weise sollten Sie die neuesten und besten Versionen haben, und es wird wahrscheinlich funktionieren. –

0

Marshmallows Vorschlag sollte in Ordnung sein.

Theoretisch könnten Sie auch versuchen, das TCP_SYNMAXRTX Makro etwas niedriger zu setzen. Es könnte aber auch andere unvorhergesehene Konsequenzen haben (von denen ich nicht überzeugt bin, da ich nicht viel über LwIP weiß).

+0

Hallo Jan;) Ich habe dieses Makro geändert, wie du gesagt hast - ich mag Risiko und setze es auf "1". Ich habe gesehen, dass, wenn ich die Karte in die Nähe des RFID Readers schiebe, die Daten ziemlich schnell schiebt (es stoppt für 3sec, nicht für 18sec - und es ist OK für mich), aber wenn ich die nächste Karte einsetze, verhält es sich wie zuvor - 18sec wartet . Nach dem Neustart gehen die ersten Daten in Ordnung, aber die nächste blockiert wie zuvor. Gibt es einen Buffor zu löschen? –