bind() Fehlercode:10014



  • Ich bin gerade dabei einen kleinen Server zu schreiben den ich später mit meinem Cient ansprechen will,aber bei der Funktion bind() gibt mir WSAGetLastError()
    immer den Fehlercode 10014 aus.Ich weiß aber nich was ich falsch mache ,vielleicht könnte mir jemand erfahreneres helfen.
    Außerdem hat der Compiler bei "inet_addr()" gemeckert weil es veraltet sei weshalb ich "_WINSOCK_DEPRECATED_NO_WARNINGS" definiert hab.Könnte mir jemand die neue Variante inetPton() erklären.
    Ich verwende Visual C++(Community 2017) unter Windows 10
    Hier mein Code:

    #define _WINSOCK_DEPRECATED_NO_WARNINGS
    #pragma comment (lib,"ws2_32.lib")
    #include <winsock2.h>
    #include<iostream>
    #include<windows.h>
    #include<iomanip>
    using namespace std;
    
    int main() {
    
    	long rc;
    	WSAData wsaData;
    	SOCKET Socket, Client;
    	sockaddr_in SInfo,CInfo;
    	//char SBuf[1500];
    	//char RBuf[1500];
    	cout << left;
    
    	cout << setw(25) << "DLL starten:";
    	rc = WSAStartup(MAKEWORD(2, 0), &wsaData);
    	if (rc == 0)
    		cout << "ERFOLGREICH";
    	else
    		cout << "FEHLGESCHLAGEN:" << WSAGetLastError();
    
    	cout << endl << setw(25) << "Socket erstellen:";
    	Socket = socket(AF_INET, SOCK_STREAM, 0);
    	if (rc != INVALID_SOCKET)
    		cout << "ERFOLGREICH";
    	else
    		cout << "FEHLGESCHLAGEN:" << WSAGetLastError();
    
    	SInfo.sin_addr.s_addr = inet_addr("95.91.222.31");
    	SInfo.sin_family = AF_INET;
    	SInfo.sin_port = htons(56743);
    	
    	cout << endl << setw(25) << "Socket binden";
    	rc = bind(Socket, (const struct sockaddr*)&SInfo, sizeof(&SInfo));
    	if (rc !=SOCKET_ERROR)
    		cout << "ERFOLGREICH";
    	else
    		cout << "FEHLGESCHLAGEN:" << WSAGetLastError();
    	
    	cout << endl << setw(25) << "Warteschlange erstellen:";
    	rc = listen(Socket, 1);
    	if (rc==0)
    		cout << "ERFOLGREICH";
    	else
    		cout << "FEHLGESCHLAGEN:" << WSAGetLastError();
    
    	cout << endl << setw(25) << "Anfrage annehmen:";
    	Client = accept(Socket, (struct sockaddr*)&CInfo,(int*)sizeof(CInfo));
    	if (Client != INVALID_SOCKET)
    		cout << "ERFOLGREICH";
    	else
    		cout << "FEHLGESCHLAGEN:" << WSAGetLastError();
    
    
    
    	while (1) {
    		
    
    
    
    
    
    	}
    	
    	
    	return 0;
    }
    

    Danke im Vorraus
    Thorsten



  • 10014 bedeutet "WSAEFAULT" (Bad address), s.a. Windows Sockets Error Codes

    Es sollte wohl sizeof(SInfo) heißen.



  • Vielen Dank für deine schnelle Antwort das hat jetzt soweit geklappt aber jetzt kommt der Fehlercode 10049 der ja besagt das irgendeine Information in SInfo nicht stimmt(?) aber eigentlich dürfte alles stimmen.Ist es egal welchen Port ich nutze solang er existiert und noch nicht verwendet wird?
    PS: Ich habe den Fehlercode von oben schon nachgeschaut hatte es nur nicht ganz verstanden.



  • Probiere mal:

    SInfo.sin_addr.s_addr = INADDR_ANY;
    

    (aus Sockets Tutorial)

    For server code, this will always be the IP address of the machine on which the server is running, and there is a symbolic constant INADDR_ANY which gets this address.



  • @thorsten54 sagte in bind() Fehlercode:10014:

    Client = accept(Socket, (struct sockaddr*)&CInfo,(int*)sizeof(CInfo));
    

    Das wird dir auch um die Ohren fliegen. Der letzte Parameter ist ein __inout Parameter, d.h. accept wird den mit iwas beschreiben (genauer: mit der Größe der Struktur, die als zweiter Parameter übergeben und ggf. angepasst wird). Du erzeugst eine temporären integer, wandelst den stumpf in einen Zeiger um und übergibst den an accept. sizeof( CInfo ) liefert iwas um 16 Bytes zurück, du wandelst die 16 in einen Zeiger um und accept beschreibt den Speicher an Adresse 16. Der Speicher gehört dir sicher nicht und damit erzeugt dein Programm undefiniertes Verhalten.

    int addr_length = sizeof( CInfo );
    Client = accept( Socket, static_cast<sockaddr*>( &CInfo ), &addr_length );
    

    Ob der static_cast an der Stelle ausreicht weiß ich nicht aus dem Kopf, möglicherweise brauchst du sogar einen reinterpret_cast. Generell solltest du keine C-style casts benutzen, sondern immer die entsprechenden C++ casts, weil die noch eine Plausibilitätsprüfung machen und der Compiler dir sagt, dass da was nicht geht. Der C-style cast verwandelt dir ohne mit der Wimper zu zucken Äpfel in Birnen.