win sock client



  • oh jo thx.

    Ich muss mir mal angewöhnen genauer zu gucken 🤡



  • Ganz am ende steht dort ja:

    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa); 
    }
    

    kann man das auch einfach so machen:

    int startWinsock(void)
    {
      WSADATA wsa;
      return 0;
    }
    

    weil funktionieren tut das Programm dann auch oder gibt es dann da irgendwelche nachteile?



  • WSAStartup muss aufgerufen werden (bevor von der Windows Socket Funktionalität gebrauch gemacht wird).
    WSACleanup auch (wenn die Windows Socket Funktionalität nicht mehr benötigt wird.)



  • ah ok thx



  • Und was Grundlegendes, bitte kein C und C++ vermischen... 😉

    Ein Frohes Fest euch allen! :xmas2:



  • wofür sind diese beiden Zeilen:

    rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));

    memset(&addr,0,sizeof(SOCKADDR_IN));

    Bei der 2ten Zeile steht ja dahinter alles auf 0 setzen aber was ist damit gemeint 😕



  • Hat den keiner eine Antwort ? 😞



  • Hi liederwams,

    rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    

    Mit dieser Zeile wird die Verbindung mit dem Socket hergestellt.
    s ist der Socket für die Verbindung.
    (SOCKADDR)&addr* ist ein Zeiger auf die Socket-Struktur, die du zuvor per

    addr.sin_family=AF_INET;
    addr.sin_port=htons(12345);
    addr.sin_addr.s_addr=inet_addr(ip.c_str());
    

    gesetzt hast. Damit sind genug Informationen für die Socket-Verbindung vorhanden.
    sizeof(SOCKADDR) gibt lediglich die Größe der Struktur an.
    Weiterführende Infos zu connect() hier: http://msdn2.microsoft.com/en-us/library/ms737625.aspx

    memset(&addr,0,sizeof(SOCKADDR_IN));
    

    Die Funktion memset setzt einen gewissen Speicherbereich auf einen bestimmten Wert; in diesem Fall den Wert 0. Memset ist ein sehr effektiver Weg, ein Array oder in diesem Fall eine Struktur zu initialisieren.
    Ich denke, dass es hier nur den Sinn hat, keine unvorhergesehenen Werte in der addr-Struktur zu haben, die eventuell stören könnten.
    Wenn du mehr über memset wissen wills, kannst du dir das hier anschaun: http://www.cppreference.com/stdstring/memset.html

    Bin zwar kein Experte auf dem Socket-Gebiet, aber das ist halt was ich so weiß 😉



  • ok thx :xmas1:



  • Warum muss in Zeile ein s stehen also ich meine damit das addr.s

    addr.sin_addr.s_addr=inet_addr(ip.c_str());
    

    weil mein socket heisst ja A und nicht s

    #include <winsock2>
    #include <iostream>
    using namespace std;
    
    int WinSock(void);
    
    int main()
    {
    long start;
    SOCKET A;
    SOCKADDR_IN addr;
    string ip;
    ip="";
    
    // socker starten
    start=WinSock();
            if(start!=0)
            {
            cout<<"Fehler Socket konnte nicht gestartet werden.\n",start;
            getchar();
            return 1;
            }
    
            else
            {
            cout<<"Socket wurde Erfolgreich gestartet\n";
            }
    
    //socket erstellen
    A=socket(AF_INET,SOCK_STREAM,0);
    
      if (A==INVALID_SOCKET)
      {
      cout<<"Fehler Socket konnte nicht erstellt werden\n",WSAGetLastError();
      getchar();
      return 1;
      }
    
      else
      {
      cout<<"Socket wurde Erfolgreich erstellt\n";
    
      }
    
    // verbinden auf sever
    
    cout<<"Server IP eingeben: ";
    cin>>ip;
    
    addr.sin_family=AF_INET;
    addr.sin_port=htons(12345);
    addr.sin_addr.s_addr=inet_addr(ip.c_str());
    
    system("PAUSE");
    return 0;
    }
    //---------------------------------------------------------------------------
    
    int WinSock(void)
    {
    WSADATA wsa;
    return WSAStartup(MAKEWORD(2,0),&wsa);
    
    }
    


  • Weil irgendwer der Meinung war, das struct-Element als "sin_addr" zu bezeichnen 😉



  • ok thx ^^



  • So ich hab den Client mal etwas verändert.

    Das man die IP eingeben kann das funktioniert ja schon jetzt möchte ich aber auch auf einen beliebigen Port connecten.

    SO hab ich es versucht aber dann bekomme ich folgende Fehlermeldungen:

    [C++ Fehler] Unit1.cpp(56): E2034 Konvertierung von 'const char *' nach 'unsigned short' nicht möglich
    [C++ Fehler] Unit1.cpp(56): E2342 Keine Übereinstimmung des Typs beim Parameter 'hostshort' ('unsigned short' erwartet, 'const char *' erhalten)

    addr.sin_family=AF_INET;
    addr.sin_port=htons(port.c_str());
    addr.sin_addr.s_addr=inet_addr(ip.c_str());
    
    #include <winsock2>
    #include <iostream>
    using namespace std;
    
    int WinSocket(void);
    
    int main()
    {
    long startSock;
    
    SOCKADDR_IN addr;
    string ip,port;
    ip="";
    port="";
    
    SOCKET erstellterSocket;
    //socket starten
    startSock=WinSocket();
    
            if (startSock!=0)
            {
            cout<<"Fehler\n",startSock;
            getchar();
            return 1;
            }
    
            else
    
            {
            cout<<"socket gestartet\n";
            }
    
    // socket erstellen
    erstellterSocket=socket(AF_INET,SOCK_STREAM,0);
            if(erstellterSocket==INVALID_SOCKET)
            {
            cout<<"Socket konnte nicht erstellt werden %d\n",WSAGetLastError;
            getchar();
            return 1;
            }
    
            else
            {
            cout<<"socket erstellt\n";
            }
    
    //verbinden zu server
    cout<<"IP Adresse eingeben: ";
    cin>>ip;
    
    cout<<"Port eingeben: ";
    cin>>port;
    
    addr.sin_family=AF_INET;
    addr.sin_port=htons(port.c_str());
    addr.sin_addr.s_addr=inet_addr(ip.c_str());
    
    startSock=connect (erstellterSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    
    if (startSock==SOCKET_ERROR)
            {
            cout<<"Kann nicht connecten\n",WSAGetLastError();
            system("PAUSE");
            return 1;
            }
    
            else
            {
            cout<<"connectet\n";
            }
    
    system("PAUSE");
    return 0;
    }
    
    int WinSocket(void)
    {
    WSADATA wsa;
    return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    


  • Die Funktion htons erwartet einen unsigned short und keinen String als Übergabeparameter.
    http://msdn2.microsoft.com/en-us/library/ms738557.aspx


Anmelden zum Antworten