server erstellen



  • hi,

    ich hab hier folgenden code:

    #include <iostream.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <winsock.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;
    }
    

    wenn ich das programm starte und dann mit telnet ne verbindung starte (telnet x.x.x.x 5432) dann funzt alles wunderbar... aber wenn jemand anderes (an nem anderen PC) versucht ne verbindung zu machen dann funktioniert das irgendwie nicht...
    könnt ihr mir vielleicht sagen wieso?

    MFG MArcel



  • listenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);



  • funktioniert trotzdem nicht



  • woran könnte das liegen?



  • Was gibt das Programm denn aus?



  • das programm gibt keinen fehler aus aber telnet findet den server net...



  • du machst aber schon "telnet deineadresse 5432" oder??



  • ja 🙂



  • ach ja: listen (xxx, NULL) hört auf genau NULL clients 😃 gib doch mal 10 oder so ein 🙂
    ansonsten weis ich nicht, ob telnet nach dem connecten ein recv macht... wäre da mal vorsichtig.



  • funktioniert leider immer noch nicht 😕



  • Du hast nicht zufällig eine Firewall oder ein IDS bei dir laufen?

    MfG, phreaking



  • ist es nicht so, dass du bei diesem accept

    sockConnected=accept(sockListen, (SOCKADDR*)&addr, &addrlen);
    
      if (sockConnected == INVALID_SOCKET)
      {
        cout << "Error: Cannot accept connection: " << WSAGetLastError() << endl;
        return 0;
      }
    

    nur verbindungen mit genau dieser adresse (addr) zulässt, andere werden nicht angenommen. in addr ist ja die lokale adresse, an die du das socket bindest. setz da addr mal auf NULL, das sollte gehen...



  • foolisch is dem ganzen auf der spur 🙂
    der nächste fehler könnte sein, dass bei accept() ein falsches SOCKADDR übergeben wird. bei accept wird in das übergebene sockaddr alle info zum client gespeichert.
    mach ganz oben ein struct sockaddr client; und bei accept dann entsprechend &client dann sollten schon mal mehr fehler behoben sein 🙂
    ansonsten: was für einen fehler meldet telnet? kann es garnicht connecten oder connected er und kommt dann nix? bei letzterem würd ich mal das erste send () im server weglassen. (und mit recv anfangen)


Anmelden zum Antworten