connect() liefert Erfolg obwohl nicht möglich!
-
Hallo zusammen,
ich hätte eine Frage zur connect() Methode. Und zwar generiere ich einen SOCKET erfolgreich und möchte mittels connect() eine Verbindung aufbauen.
Obwohl der Rechner nicht am Netz hängt oder die Zieladresse nicht existiert, liefert mir die connect() Methode immer 0 = connect() erfolgreich.Die Zielhardware ist ein WidowsCE 6.0.
Unter WinCE 4.2 hat es noch funktioniert.Bekomme erst später mittels
count = recv(...)
mit, dass ein Fehler aufgetreten ist (count = -1).
Nach Aufruf von WSAGetLastError() erhalte ich 10054 = eine vorhandene Verbindung wurde vom Remotehost geschlossen.Kann ich das nicht irgendwie vor dem Aufruf von recv() ermitteln, dass keine Verbindung besteht?
Vielen Dank.
Grüße, Kaiser.
-
Vermutlich ist dein Socket im non-blocking Modus.
Bei Desktop-Windowsen ist Default-Einstellung blocking, ich nehme an bei CE wird es das selbe sein.
=> stell den Socket erst nach connect() auf non-blocking um
-
Ich möchte ja den Blocking-Modus. Der sollte laut Doku auch voreingestellt sein.
Werds aber mal ab Dienstag überprüfen - danke.Grüße, Kaiser
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Habe definitiv blocking mode und folgenden Quellcode:
m_ClientSocket = socket( AF_INET, SOCK_STREAM, 0); memset(&m_ClientAdr, 0, sizeof(m_ClientAdr)); memset(&m_ServerAdr, 0, sizeof(m_ServerAdr)); m_ServerAdr.sin_family = AF_INET; m_ServerAdr.sin_addr.S_un.S_un_b.s_b1 = m_aucServerIP[0]; m_ServerAdr.sin_addr.S_un.S_un_b.s_b2 = m_aucServerIP[1]; m_ServerAdr.sin_addr.S_un.S_un_b.s_b3 = m_aucServerIP[2]; m_ServerAdr.sin_addr.S_un.S_un_b.s_b4 = m_aucServerIP[3]; m_ServerAdr.sin_port = htons(m_uiPort); int iResult = connect(m_ClientSocket, (struct sockaddr*)&m_ServerAdr, sizeof(m_ServerAdr));
Verhalten wie gehabt.
Erst die recv() Methode liefert sofort -1 zurück und sagt mir dass keine Verbindung besteht.
Müsste nicht schon die connect() Methode fehlschlagen?
Oder hab ich doch nen Bug im Quellcode?
-
Habs auf der älteren Plattform (WinCE4.2) probiert, und da ist das Verhalten wie folgt:
* connect() liefert nach Timeout -1 zurück.
* Ein Aufruf von WSAGetLastError() liefert 10060 zurück:
"Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht ordnungsgemäß reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat."So ein Verhalten hätte ich jetzt auch unter WinCE6.0 erwartet. Hier liefert connect() sofort 0 zurück.
Übrigens ist der Quellcode identisch (gleiches Sourcefile).
-
Habe das Problem entdeckt.
Lag doch am non-blocking Modus.
Komischerweise war wohl unter WinCE6.0 der default doch der non-blocking modus aktiviert (ganz im Gegensatz zur Doku und WinCE4.2).
Hab jetzt explizit vor dem connect folgendes hinzugefügt:u_long ul = 0U; ioctlsocket(m_ClientSocket, FIONBIO, &ul);
Damit liefert mir der connect() Aufruf sofort -1 zurück.
-
Komisch. Passt jetzt alles nach Umstellen auf blocking?
Weil du schreibst "sofort".
Wenn das Gerät dessen zu dem du eine Verbindung aufbauen willst nicht läuft, dürfte connect() ja nicht sofort einen Fehler zurückmelden. Sondern erst nach ~21 Sekunden.
-
Stimmt - tschuldigung. War wohl etwas schnell mit dem tippen.
Braucht zwar nicht ganze 21 Sekunden, aber so ca. 10 müssten es schon sein.
Was mir jedoch aufgefallen ist, ich musste diesen Aufruf von ioctlsocket() nur einmal ausführen. Wenn ich ihn anschliessend auskommentiert und mein Programm neu gestartet habe, hat es auch noch funktioniert.
Wird der Modus irgendwo gespeichert, z.B. Registry?
-
Kaiser schrieb:
Stimmt - tschuldigung. War wohl etwas schnell mit dem tippen.
Macht ja nix
Braucht zwar nicht ganze 21 Sekunden, aber so ca. 10 müssten es schon sein.
OK, dann hat Windows CE wohl andere TCP/IP Timings als das "normale" Windows. Macht aber auch nix.
Was mir jedoch aufgefallen ist, ich musste diesen Aufruf von ioctlsocket() nur einmal ausführen. Wenn ich ihn anschliessend auskommentiert und mein Programm neu gestartet habe, hat es auch noch funktioniert.
Wird der Modus irgendwo gespeichert, z.B. Registry?Nö, die Einstellung ist normalerweise per Socket.
Vermutlich hast du gleichzeitig noch was anderes verändert, was du dann beim 2. Versuch nicht wieder rausgenommen/zurückgeändert hast.
Oder dein Build-System hat die nen Streich gespielt, und irgendwas nicht neu compiliert/gelinkt - das könntest du einfach mit "rebuild all" überprüfen. Bzw. noch besser: vorher alle beim Compilieren/Linken erzeugten Files von Hand löschen, und dann erst "rebuild all".Entweder gehst du der Sache auf den Grund, und findest raus was nun wirklich der ausschlaggebende Faktor war. Wenn du das nicht tun willst, bzw. keine Zeit dafür hast würde ich empfehlen den ioctlsocket Call drinnen zu lassen - schaden kann er ja nicht.
-
Vielen Dank für die schnellen Antworten.
Den ioctlsocket() call werde ich wohl drin lassen - zumindest auf dieser Hardware. Wird ja mehrfach auf identischer Hardware installiert - sicher ist sicher.Schöne Grüße, Kaiser