Winsocks Fehlercode 2



  • Ich habe bei meiner Anwendung den Winsocks Fehlercode 2 zurückgegeben bekommen.
    Allerdings findet sich zu diesem nichts bei MSDN

    Hier mein Quellcode:

    #include <stdio.h>
    #include <stdlib.h>
    #include <crossnet.h>
    
    int main(int argc, char *argv[])
    {
        SOCKET sock = create_socket( AF_INET, SOCK_STREAM, 0 );
        struct sockaddr_in server;
        unsigned long addr;
        // Alternative zu memset() -> bzero()
        memset( &server, 0, sizeof (server));
        addr = inet_addr( argv[1] );
        memcpy( (char *)&server.sin_addr, &addr, sizeof(addr));
        server.sin_family = AF_INET;
        server.sin_port = htons(80);
    
        // Baue die Verbindung zum Server auf
        if (connect(sock,(struct sockaddr*)&server, sizeof(server)) < 0)
        {
            printf("Error with connect(): %d\n",WSAGetLastError());
        }
        if( (send(sock,"test",sizeof("test"),0)) != -1)
        {
            printf("sent successful\n");
        }
    
        system("Pause");
        return 0;
    }
    

    Die Headerdatei crossnet.h ist eine (unfertige) selbstgeschriebene Headerdatei, die cross platform Funktionen zum netzwerken mit Windows und Linux zur Verfügung stellen soll:

    //header file for cross-platform networking
    
    #ifdef __WIN32__
    #include <winsock.h>
    #endif
    
    #ifdef __linux__
    #include <sys/types.h>
    #include <sys/socket.h>
    #endif
    
    void error_exit(const char *string)
    {
        #ifdef __WIN32__
        printf("%s: %d",string,WSAGetLastError());
        #endif
        #ifdef __linux__
        perror(string);
        #endif
        exit(-1);
    }
    
    int create_socket(int af, int type, int protocol)
    {
        #ifdef __WIN32__
        WSADATA *wsadat;
        if(WSAStartup(MAKEWORD(2,2),wsadat) != 0)
        {
            error_exit("WSAStartup() failed");
        }
        #endif
        int sock;
        if(sock = socket(af,type,protocol) < 0)
        {
            error_exit("socket creating failed");
        }
        return sock;
    }
    


  • Wenn WSAStartup fehlschlägt kannst du nicht WSAGetLastError verwenden. WSAStartup schlägt fehl weil wsadat ins nichts zeigt.



  • Habe es jetzt zum laufen bekommen indem ich dem Zeiger mit malloc() Speicher zugewiesen habe. Was gibt es eigentlich für Möglichkeiten um den Fehler auszugeben wenn WSAStartUp fehlschlägt?



  • Der Rückgabewert ist der Winsock-Fehlercode.

    Warum nicht einfach auf dem Stack anlegen?



  • Noch ein Fehler, diesmal 10038 bei connect()

    Quellcode:

    #include <stdio.h>
    #include <stdlib.h>
    #include <crossnet.h>
    
    int main(int argc, char *argv[])
    {
        SOCKET sock = create_socket( AF_INET, SOCK_STREAM, 0 );
        con(sock,AF_INET,"127.0.0.1",80);
        if( (send(sock,"test",sizeof("test"),0)) != -1)
        {
            printf("sent successful\n");
        }
    
        system("Pause");
        return 0;
    }
    

    Und die Headerdatei:

    //header file for cross-platform networking
    
    #ifdef __WIN32__
    #include <winsock.h>
    #endif
    
    #ifdef __linux__
    #include <sys/types.h>
    #include <sys/socket.h>
    #endif
    
    void error_exit(const char *string)
    {
        #ifdef __WIN32__
        printf("%s: %d",string,WSAGetLastError());
        #endif
        #ifdef __linux__
        perror(string);
        #endif
        exit(-1);
    }
    
    int create_socket(int af, int type, int protocol)
    {
        #ifdef __WIN32__
        int err;
        LPWSADATA wsadat = (LPWSADATA) malloc(sizeof(LPWSADATA)); //LPWSADATA = wsadat* ==> malloc()
        if(WSAStartup(MAKEWORD(2,2),wsadat) != 0)
        {
            printf("WSAStartup() failed");
            exit(-1);
        }
        #endif
        int sock;
        if(sock = socket(af,type,protocol) < 0)
        {
            error_exit("socket creating failed");
        }
        return sock;
    }
    
    void con(int socket, int af, const char *ip, int port)
    {
        struct sockaddr_in server;
        unsigned long addr = inet_addr(ip);
        memset( &server, 0, sizeof (server)); //needed?
        memcpy((char *) &server.sin_addr, &addr, sizeof(addr));
        server.sin_family = af;
        server.sin_port = htons(port);
        if(connect(socket, (struct sockaddr *)&server, sizeof(server)) != 0)
        {
            error_exit("connect() failed");
        }
    }
    


  • Weiß keiner, woran es liegen könnte?


Anmelden zum Antworten