Socket Problem
-
geeky schrieb:
Holst du auch bei jedem FD_READ sämtliche Daten (via recv z.B.) aus dem Empfangsbuffer? Weitere FD_READ-Nachrichten für denselben Socket werden von Winsock unterdrückt solange die Daten für das erste FD_READ nicht vollständig aus dem Empfangsbuffer geholt worden sind...
A single recv in response to each FD_READ message is appropriate.
-
Ok, da hat mich mein Gedächtnis wohl verarscht

-
Hätte noch ein anderes Problem.
Wenn ich den Client starte zeigt er mir an, dass ich verbunden bin obwohl noch kein Server existiert. Das heißt wohl er bekomt ein FD_CONNECT ohne verbunden zu sein.
-
Gibt es ein anderes Socket-Evenet, mit dem ich abfragen kann ob ein Server vorhanden ist?
-
wenn der connect fehlschlägt, also kein server da ist bzw. keiner gefunden, gibt es als return code "SOCKET_ERROR".
das problem liegt wohl an deinem programm, das du irgendwo etwas falsch ausgibts. wenn der server nicht da ist, kann sich der socket nicht dahin connecten.
-
Wenn kein Server vorhanden ist bekomme ich auch SOCKET_ERROR aber anschließend trotzdem FD_CONNENCT. Was könnte falsch sein?
... WSADATA wsa; rc=WSAStartup(MAKEWORD(2,0),&wsa); ... clientSocket=socket(AF_INET,SOCK_STREAM,0); WSAAsyncSelect(clientSocket,hwnd,WM_SOCKET_NOTIFY,FD_READ|FD_CLOSE|FD_CONNECT); memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(port); addr.sin_addr.s_addr=inet_addr(ip); rc = connect(clientSocket,(struct sockaddr*)&addr,sizeof(addr)); if( rc == SOCKET_ERROR) { SendMessage(hwndLA, LB_DELETESTRING, 0, 0); SendMessage(hwndLA, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(TEXT("- connect Fehler"))); return; } ... case WM_SOCKET_NOTIFY: switch(LOWORD(lParam)) { ... case FD_CONNECT: SendMessage(hwndLA, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(TEXT("- Verbunden"))); return 0; ...
-
Dann prüf doch auf Fehler mit dem Makro WSAGETSELECTERROR auf lParam.
-
WSAGetLastError liefert: WSAEWOULDBLOCK
-
lern mal lesen junge
-
Sorry für meine Ausdrucksweise. Wenn du FD_CONNECT bekommst kannst du nicht mehr WSAGetLastError benutzen sondern der Error-Code befindet sich dann in lParam und kann mit WSAGETSELECTERROR extrahiert werden.
-
Ich dachte das käme aufs gleiche raus.
WSAGETSELECTERROR(lParam) liefert : WSAECONNREFUSED
-
Ok, Problem gelöst vielen Dank für die Hilfe.
Trotzdem komisch, dass der Client FD_CONNECT gepostet bekommt obwohl WSAGETSELECTERROR WSAECONNREFUSED liefert
-
Ist aber dokumentiert.
FD_CONNECT:
After connect, WSAConnect, or WSAJoinLeaf was called with a nonblocking, connection-oriented socket. The initial operation returned with a specific error of WSAEWOULDBLOCK, but the network operation went ahead. Whether the operation eventually succeeds or not, when the outcome has been determined, FD_CONNECT happens. The client should check the error code to determine whether the outcome was successful or failed.