Socket Problem



  • 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...



  • Bin begeistert, es funktioniert.
    Vielen Dank für die Hilfe.



  • 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.


Anmelden zum Antworten