SOCKET SERVER



  • /*********************************************************************

    Ein sehr(!!) Simpler Socket Server.
    -----------------------------------

    Beachtet das es nur ein Beispiel ist welches nicht ausprogrammiert ist.
    Es fehlen Anweisungen wie closesocket und WSACleanup.
    Ebenfalls wird hier auch nicht verhindert das mehrere Verbindungen
    hergestellt werden können.
    Aber zum demonstieren wie man eine Verbingung annimmt und Daten
    sendet und empfänget ist es recht geeignet.
    Eventuell hat es auch noch einige Fehler im Code..

    #include <iostream.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <winsock2.h>
    
    #define  SERVER_PORT             5432
    #define  RECV_BUF_MAXLEN         256
    #define  SEND_BUF_MAXLEN         256
    
    long WinsockStartup();
    
    int main()
    {
      long   rc;
    
      SOCKET sockListen;
      SOCKET sockConnected;
      SOCKADDR_IN addr;
      int addrlen = sizeof(addr);
    
      char sendBuf[SEND_BUF_MAXLEN+1];
      char recvBuf[RECV_BUF_MAXLEN+1];
    
      addr.sin_addr.s_addr = 0;
      addr.sin_family = AF_INET;
      addr.sin_port = htons(SERVER_PORT);
    
      rc = WinsockStartup();
      if (rc == SOCKET_ERROR)
      {
        cout << "Error: Winsock Startup failed: " << WSAGetLastError() << endl;
        return 0;
      }
      sockListen=socket(AF_INET,SOCK_STREAM,NULL);
      if (sockListen == INVALID_SOCKET)
      {
        cout << "Error: Cannot create Socket: " << WSAGetLastError() << endl;
        return 0;
      }
      rc = bind(sockListen, (SOCKADDR*)&addr, sizeof(addr));
      if (rc == SOCKET_ERROR)
      {
        cout << "Error: Cannot bind Socket: " << WSAGetLastError() << endl;
        return 0;
      }
      rc = listen(sockListen, NULL);
      if (rc == SOCKET_ERROR)
      {
        cout << "Error: Cannot listen: " << WSAGetLastError() << endl;
        return 0;
      }
      cout << "Waiting for a connection..." << endl;
      sockConnected=accept(sockListen, (SOCKADDR*)&addr, &addrlen);
      if (sockConnected == INVALID_SOCKET)
      {
        cout << "Error: Cannot accept connection: " << WSAGetLastError() << endl;
        return 0;
      }
      rc = send(sockConnected,"Hallo\0",6,NULL);
      if (rc == SOCKET_ERROR)
      {
        cout << "Error: Cannot send Data: " << WSAGetLastError() << endl;
        return 0;
      }
      cout << rc << " Bytes sent !" << endl;
      while (1)
      {
        rc = recv(sockConnected,recvBuf,RECV_BUF_MAXLEN,NULL);
        if (rc == SOCKET_ERROR)
        {
          cout << "Error: Cannot recv Data: " << WSAGetLastError() << endl;
          return 0;
        }
        if (rc == 0)
        {
          cout << "Other Host has closed the connection !" << endl;
          return 0;
        }
        recvBuf[rc] = '\0';
        cout << rc << " Bytes received: " << recvBuf << endl;
        rc = send(sockConnected,"Ganz meine Meinung\0",19,NULL);
        if (rc == SOCKET_ERROR)
        {
          cout << "Error: Cannot send Data: " << WSAGetLastError() << endl;
          return 0;
        }
        cout << rc << " Bytes sent !" << endl;
      }
    }
    
    long WinsockStartup()
    {
      long rc;
    
      WORD wVersionRequested;
      WSADATA wsaData;
      wVersionRequested = MAKEWORD(2, 1);
    
      rc = WSAStartup( wVersionRequested, &wsaData );
      return rc;
    }
    

    Testen könnt ihr ihn indem ihn auf '127.0.0.1 5432' eine telnet Verbindung
    herstellt (telnet 127.0.0.1 5432). Er wird euch erst "Hallo" sagen,
    und dann alle weiteren Daten welche ihr sendet mit "Ganz meine Meinung"
    beantworten. Simpel halt.

    MEINE FRAGE:
    Wo wird hier die IP 127.0.0.1 übergeben?
    Bin noch Anfänger



  • hermes schrieb:

    Es fehlen Anweisungen wie closesocket und WSACleanup.
    Ebenfalls wird hier auch nicht verhindert das mehrere Verbindungen
    hergestellt werden können.
    Aber zum demonstieren wie man eine Verbingung annimmt und Daten
    sendet und empfänget ist es recht geeignet.

    Dafür ist es eben nicht so gut geeignet, wenn Aufrufe von closesocket und WSACleanup fehlen. 🙄
    So ein Beispiel sollte immer so kurz wie möglich, aber so lang wie nötig sein.

    MEINE FRAGE:
    Wo wird hier die IP 127.0.0.1 übergeben?

    Es gibt da die Variable addr. Das sieht doch stark nach der Adresse aus. 😉



  • Ich würde gerne Daten mit einem anderen PC im LAN oder WAN austauschen,
    ist diese Methode überhaupt die richtige dafür?



  • Lern erst mal die Grundlagen.

    So wie ich dich einschätze wird ohne ein Buch zu WINSOCK nichts klappen.
    Hol dir ein Buch.

    MfG, Tolga.



  • es gibt zu winsock keine aktuelle [edit] deutschen [/edit] bücher (zumindest nicht bei amazon oder bol) aber wenn du die tutorials auf der seite liest wo du den sourcecode herhast (böse böse keine quellen anzugeben 👎 ) wirst du das wohl hinbekommen



  • muhkuhmasta schrieb:

    es gibt zu winsock keine aktuellen bücher

    Da würde ich an deiner Stelle hoffen, dass das keiner mitbekommt.. 😉




Anmelden zum Antworten