winsock client server konstrukt übers internet



  • Wenn ich versuche meinen Server Socket an eine feste IP zu binden schlägt das immer fehl ...

    SOCKADDR_IN addr;
    
        memset(&addr,0,sizeof(SOCKADDR_IN));
    
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        //addr.sin_addr.s_addr = ADDR_ANY;
        addr.sin_addr.s_addr = inet_addr ("192.168.178.25");
    
        bind(s,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    

    Das klappt nur bei Netzwerk internen Adressen oder Hostnamen.
    Wenn ich nun meine Internet IP über z.B "wieistmeineip.de" rausfinde und diese dann eintrage wird der Socket nicht gebunden 😕

    Muss ich da anders vorgehen wenn ich einen Client Server Verbindung übers Internet herstellen möchte ?



  • Du musst dir einen Root Server kaufen! Und dein Server dort draufspielen mit der IP



  • SOCKET ListenSocket = INVALID_SOCKET;
    
        struct addrinfo *result = NULL, hints;
    
        int iResult;
    
        ZeroMemory(&hints, sizeof(hints));
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_protocol = IPPROTO_TCP;
        hints.ai_flags = AI_PASSIVE;
    
        // Resolve the server address and port
        iResult = getaddrinfo(NULL, 5000/*Port*/, &hints, &result);
        if ( iResult != 0 ) {
            printf("getaddrinfo failed: %d\n", iResult);
        }
    
        // Create a SOCKET for connecting to server
        ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
        if (ListenSocket == INVALID_SOCKET) {
            printf("socket failed: %ld\n", WSAGetLastError());
        }
    
        // Setup the TCP listening socket
        iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);
    
        ...
    


  • Delta- schrieb:

    Du musst dir einen Root Server kaufen! Und dein Server dort draufspielen mit der IP

    Ist es also nicht möglich ein Chat Programm ohne Root Server zu programmieren ?

    Belli schrieb:

    SOCKET ListenSocket = INVALID_SOCKET;
           
        struct addrinfo *result = NULL, hints;
      
        int iResult;
      
        ZeroMemory(&hints, sizeof(hints));
        hints.ai_family = AF_INET;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_protocol = IPPROTO_TCP;
        hints.ai_flags = AI_PASSIVE;
    
        // Resolve the server address and port
        iResult = getaddrinfo(NULL, 5000/*Port*/, &hints, &result);
        if ( iResult != 0 ) {
            printf("getaddrinfo failed: %d\n", iResult);
        }
                      
        // Create a SOCKET for connecting to server
        ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
        if (ListenSocket == INVALID_SOCKET) {
            printf("socket failed: %ld\n", WSAGetLastError());
        }
                        
        // Setup the TCP listening socket
        iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);
    
        ...
    

    Ich habe den Code zu meinem hinzugefügt bzw. ersetzt aber es gibt immer Fehler bei dem binden 😕



  • Das mit dem RootServer zeugs ist doch quatsch.

    Was gibts für ein Fehler beim bind(..)?

    Simon



  • Du willst deinen Server an eine eigene IP fest binden?! Wo gibt's denn sowas? 😃

    Du musst dir keinen Rootserver kaufen, das ist Quatsch, aber eine feste IP, die musst du von deinem Provider kaufen. IdR solltest du aber als sin_addr sowieiso INADDR_ANY benutzen.



  • Hier mal Code meines Clients:

    #include <iostream>
    #include <windows.h>
    #include <winsock2.h>
    #include <string>
    
    using namespace std;
    
    int StartWinsock ();
    int ConnectToServer ( SOCKET s );
    long GetAddr ( string hostnameOrIp, SOCKADDR_IN* addr );
    
    int main()
    {
        long ret = StartWinsock();
    	SOCKET s;
    
        if ( ret != 0 )
            cout << "Winsock konnte nicht gestartet werden, ERROR: " << ret << endl;
        else cout << "Winsock gestartet!" << endl;
    
        s = socket (AF_INET,SOCK_STREAM,0);
    
        if ( s == INVALID_SOCKET )
            cout << "Socket konnte nicht erstellt werden, ERROR: " << WSAGetLastError () << endl;
        else cout << "Socket erstellt!" << endl;
    
        if ( ConnectToServer (s) == SOCKET_ERROR )
            cout << "Connect gescheitert, ERROR: " << WSAGetLastError() << endl;
        else cout << "Verbunden" << endl;
    
        // datenaustausch
        char sBuffer[] = "ICH BIN DER CLIENT";
        char rBuffer[256];
    
        send (s,sBuffer,strlen(sBuffer),0);
        recv (s,rBuffer,256,0);
    
        cout << rBuffer << endl;
    
        cin.get();
        closesocket (s);
        WSACleanup();
        return 0;
    }
    
    int StartWinsock ()
    {
        WSAData wsa;
    
        // ohne WSAStartup schlägt jede weitere winsock funktion fehl
    
        return WSAStartup (MAKEWORD(1,2),&wsa);
    }
    
    int ConnectToServer ( SOCKET s )
    {
        SOCKADDR_IN addr;
    
        memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
    
        // struct füllen
        addr.sin_family = AF_INET;
        addr.sin_port = htons(12345); // wir verwenden mal port 12345
        //addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // zielrechner ist unser eigener
        if ( GetAddr ( "ich.no-ip.org"/*meine dynamische ip*/, &addr ) == SOCKET_ERROR )
            cout << "Adresse konnte nicht aufgeloest werden" << endl;
        return connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    }
    
    long GetAddr ( string hostnameOrIp, SOCKADDR_IN* addr )
    {
    
      long rc;
      unsigned long ip;
      HOSTENT* he;
    
      /* Parameter prüfen */
    
      if( addr == NULL)
        return SOCKET_ERROR;
    
      /* eine IP in hostnameOrIp ? */
    
      ip = inet_addr(hostnameOrIp.c_str());
    
      /* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */
    
      if( ip != INADDR_NONE)
      {
            addr->sin_addr.s_addr = ip;
            return 0;
      }
      else
      {
    
        /* Hostname in hostnameOrIp auflösen */
    
        he = gethostbyname(hostnameOrIp.c_str());
    
        if( he == NULL )
    
        {
            return SOCKET_ERROR;
        }
        else
        {
          /*die 4 Bytes der IP von he nach addr kopieren */
            memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
        } return 0;
      }
    }
    

    Und hier nun der Server Socket bind:

    int BindSocket ( SOCKET s , u_short port )
    {
        SOCKADDR_IN addr;
    
        memset(&addr,0,sizeof(SOCKADDR_IN));
    
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        addr.sin_addr.s_addr = INADDR_ANY;
    
        return bind(s,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    }
    

    Wenn ich nun beide ausführe kommt nach einer Zeit der Fehler: WSAETIMEDOUT 10060



  • Ad aCTa schrieb:

    Du willst deinen Server an eine eigene IP fest binden?! Wo gibt's denn sowas? 😃

    Das wird häufig gemacht um EIN bestimmtes Interface von mehreren Interfaces auszuwählen. Macht also durchaus Sinn.

    Simon



  • Danke für alle Antworten.
    Problem gelöst, der Port war nicht freigegeben :|



  • bujaaa schrieb:

    Danke für alle Antworten.
    Problem gelöst, der Port war nicht freigegeben :|

    Rofl Koffer



  • hey kannste mir den code mal per icq senden? schreib mir mal pls ne pm, dann schick ich dir meine icq nummer 🙂
    vielen dank schon mal im voraus


Anmelden zum Antworten