WinSock2: Problem mit Accept-Socket...



  • Hmm und was soll das bringen? Ich mach dann nur noch in nem Thread:

    if (::listen(Comm::Socket, MAX_CLIENTS) != 0) //#define MAX_CLIENTS 10
    {}
    
    SOCKET ClientSock;
    ClientSock = ::accept(Comm::Socket, NULL, NULL);
    if (ClientSock == INVALID_SOCKET)
    {}
    


  • Bist Du *ganz* sicher, das "listen" 0 liefert??? Kann ich mir eigentlich nicht vorstellen...

    Was noch aus der Doku zu beachten ist:

    If listen is called on an already listening socket, it will return success without changing the backlog.

    Du rufst nicht zufällig das "listen" zweimal auf?



  • Nachdem du die Frage aufgeworfen hast, hab ich nochmal den Debugger drüber gejagt...und ja ich bin mir sicher. 😃
    Aber erklären kann ich's mir auch nicht.

    Wenn ich bei "accept(...)" eine Auswertung der From-Werte mache:

    sockaddr_in From;
    int FromLen = sizeof(From);
    ::memset (&From, 0, sizeof(From));
    
    SOCKET ClientSock = INVALID_SOCKET;
    ClientSock = ::accept(Comm::Socket, (sockaddr*)&From, &FromLen);
    

    stehen auch unsinnige Werte in "From":

    From.sin_family = 0
    From.sin_port = 0
    FromLen = 16

    [Edit]

    Jochen Kalmbach schrieb:

    Du rufst nicht zufällig das "listen" zweimal auf?

    Nö eigentlich nicht. Der Ablauf ist ja prinzipiell so, dass der Server mit dem Accept-Socket erstellt wird. Wenn die Initialisierung korrekt abgelaufen ist, wird der Thread mit dem "listen()" gestartet.
    [/Edit]



  • Hmm und was soll das bringen?

    Wenn der Fehler auch bei mir kommt kann ich ihn dir beheben 😉



  • Gut das seh ich ein. 😉 Der komplette Quelltext wäre ein bisschen viel hier, deswegen hab ich wirklich nur die WinSock-Sachen reingeschrieben.



  • Und ein neues Projekt anlegen wo nur die WinSock Sachen drin sind und das den Fehler zeigt willst du nicht? 😞



  • Doch mach ich grad. Vielleicht liegt's ja am Thread, aber das kann ich mir eigentlich nicht vorstellen.



  • #include <Winsock2.h>
    #include <Windows.h>
    #include <ws2tcpip.h>
    #include <iphlpapi.h>
    
    #include <conio.h>
    
    #include <iostream>
    using namespace std;
    
    #define DEF_PORT "24837"
    
    int main (const int argc, const char** argv)
    {
    	addrinfo *pRes = NULL;
    
    	addrinfo Hints;
    	::memset(&Hints, 0, sizeof(addrinfo));
    
    	Hints.ai_family = AF_INET;
    	Hints.ai_socktype = SOCK_STREAM;
    	Hints.ai_protocol = IPPROTO_TCP;
    	Hints.ai_flags = AI_PASSIVE;
    
        int iRet = 0;
    	if (iRet = ::getaddrinfo(NULL, DEF_PORT,
    		&Hints, &pRes) != 0)
    		return -1;
    
    	SOCKET Accept = INVALID_SOCKET;
    	if ((Accept = ::socket(pRes->ai_family, 
    		pRes->ai_socktype, pRes->ai_protocol)) == INVALID_SOCKET)
    		return -2;
    
    	if (::bind(Accept, pRes->ai_addr, 
    		static_cast<int>(pRes->ai_addrlen)) != 0)
    	{
    		::closesocket(Accept);
    		return -3;
    	}
    
    	::freeaddrinfo(pRes);
    
    	SOCKET Client = INVALID_SOCKET;
    	while (_getch() != 27)
    	{
    		cout << "Start \"listen()\"\n";
    		if ((iRet = ::listen(Accept, 10)) != 0)
    		{
    			cerr << "Error: \"listen()\" -> " << iRet << "\n";
    			break;
    		}
    
    		if ((Client = ::accept(Accept, NULL, NULL)) == INVALID_SOCKET)
    		{
    			cerr << "Error: \"accept()\" -> INVALID_SOCKET\n";
    			break;
    		}
    		cout << "Client verbunden.\n";
    	}
    
    	system("Pause");
    	::closesocket(Accept);
    	return 0;
    }
    

    So jetzt bin ich ganz verwirrt. Jetzt wird die Anwendung mit "-1" beendet. Ich hab jetzt aber nur die Winsock-Sachen per c&p eingefügt und die Klassenelement mit lokalen Variablen ersetzt. 😕 "iRet" hat den Wert "1".

    [Edit]
    Hab das WSAStartUp() vergessen. Sorry.
    [/Edit]



  • Hast du auch WSAStartup aufgerufen?



  • #include <Winsock2.h>
    #include <Windows.h>
    #include <ws2tcpip.h>
    #include <iphlpapi.h>
    
    #include <conio.h>
    
    #include <iostream>
    using namespace std;
    
    #define DEF_PORT "24837"
    
    int main (const int argc, const char** argv)
    {
    	WSAData wsa;
    	if (::WSAStartup(MAKEWORD(2,0), &wsa) != 0)
    		return -11;
    
    	addrinfo *pRes = NULL;
    
    	addrinfo Hints;
    	::memset(&Hints, 0, sizeof(addrinfo));
    
    	Hints.ai_family = AF_INET;
    	Hints.ai_socktype = SOCK_STREAM;
    	Hints.ai_protocol = IPPROTO_TCP;
    	Hints.ai_flags = AI_PASSIVE;
    
    	int iRet = 0;
    	if (iRet = ::getaddrinfo(NULL, DEF_PORT,
    		&Hints, &pRes) != 0)
    		return -1;
    
    	SOCKET Accept = INVALID_SOCKET;
    	if ((Accept = ::socket(pRes->ai_family, 
    		pRes->ai_socktype, pRes->ai_protocol)) == INVALID_SOCKET)
    		return -2;
    
    	if (::bind(Accept, pRes->ai_addr, 
    		static_cast<int>(pRes->ai_addrlen)) != 0)
    	{
    		::closesocket(Accept);
    		return -3;
    	}
    
    	::freeaddrinfo(pRes);
    
    	SOCKET Client = INVALID_SOCKET;
    	while (_getch() != 27)
    	{
    		cout << "Start \"listen()\"\n";
    		if ((iRet = ::listen(Accept, 10)) != 0)
    		{
    			cerr << "Error: \"listen()\" -> " << iRet << "\n";
    			break;
    		}
    
    		if ((Client = ::accept(Accept, NULL, NULL)) == INVALID_SOCKET)
    		{
    			cerr << "Error: \"accept()\" -> INVALID_SOCKET\n";
    			break;
    		}
    		cout << "Client verbunden.\n";
    	}
    
    	system("Pause");
    	::closesocket(Accept);
    	::WSACleanup();
    	return 0;
    }
    

    So jetzt aber. Jetzt blockiert er auch ganz normal im Lauschzustand. Versteh ich nicht. 😕


Anmelden zum Antworten