problem mit sockets



  • Hi Leute

    ich hab jetzt im Internet son schönes Tutorial über Sockets gefunden, das sogar ich halbwegs versteh. Das ganze hab ich kompiliert und ausgeführt, hat auch auf meinem eigenen PC super geklappt. Dann hab ich das mal nem Freund geschickt, um zu schaun, ob das auch übers Internet geht, und es hat leider nich geklappt =(. Jetzt wüsst ich gerne warum und hoff ihr könnt mir dabei helfen ^^
    Hier mal der quellcode:
    Server:

    #include <iostream>
    #include<winsock2.h>
    #include<windows.h>
    
    using namespace std;
    
    int startWinsock();
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr);
    
    SOCKET s;
    SOCKET connectedSocket;
    SOCKADDR_IN addr;
    char buf[256];
    char buf2[256];
    
    int main()
    {
        int rc;
        rc=startWinsock();
        if(rc!=0)
        {
            cout<<"Winsock nicht gestartet"<<endl;
        }
        else
        {
            cout<<"Winsock gestartet"<<endl;
        }
    
        s=socket(AF_INET, SOCK_STREAM, 0);
        if(s==INVALID_SOCKET)
        {
            cout<<"Socket wurde nicht erstellt, Fehler: "<<WSAGetLastError()<<endl;
        }
        else
        {
            cout<<"Socket wurde erstellt"<<endl;
        }
    
        memset(&addr, 0, sizeof(SOCKADDR_IN));
    
        addr.sin_family=AF_INET;
        addr.sin_port=htons(12345);
        addr.sin_addr.s_addr=ADDR_ANY;
    
        rc=bind(s,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    
        if(rc==SOCKET_ERROR)
        {
            cout<<"Fehler bing, Fehlercode: "<<WSAGetLastError()<<endl;
        }
        else
        {
            cout<<"Socket an Port "<<addr.sin_port<<" gebunden"<<endl;
        }
    
        rc=listen(s, 10);
        if(rc==SOCKET_ERROR)
        {
            cout<<"Fehler: listen, fehlercode: "<<WSAGetLastError()<<endl;
        }
        else
        {
            cout<<"Socket ist im Listen-Modus"<<endl;
        }
    
        connectedSocket=accept(s,NULL,NULL);
    
        if(connectedSocket==INVALID_SOCKET)
    
        {
    
          cout<<"Fehler accept, fehlerdoce: "<<WSAGetLastError()<<endl;
    
          return 1;
    
        }
    
        else
    
        {
    
          cout<<"Neue Verbindung akzeptiert"<<endl;
    
        }
    
        while(rc!=SOCKET_ERROR)
      {
        rc=recv(connectedSocket,buf,256,0);
        if(rc==0)
        {
          printf("Server hat die Verbindung getrennt..\n");
          break;
        }
        if(rc==SOCKET_ERROR)
        {
          printf("Fehler: recv, fehler code: %d\n",WSAGetLastError());
          break;
        }
        buf[rc]='\0';
        printf("Client sendet: %s\n",buf);
        sprintf(buf2,"Du mich auch %s",buf);
        rc=send(connectedSocket,buf2,strlen(buf2),0);
        }
        closesocket(s);
        closesocket(connectedSocket);
        WSACleanup();
    
        cout<<"Verbindung unterbrochen"<<endl;
        system("pause");
    
        return 0;
    }
    
    int startWinsock()
    
    {
    
      WSADATA wsa;
    
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)
    
    {
    
      long rc;
    
      unsigned long ip;
    
      HOSTENT* he;
    
      /* Parameter prüfen */
    
      if(hostnameOrIp==NULL || addr==NULL) return SOCKET_ERROR;
    
      /* eine IP in hostnameOrIp ? */
    
      ip=inet_addr(hostnameOrIp);
    
      /* 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);
    
        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 der client:

    #include <iostream>
    #include<winsock2.h>
    #include<windows.h>
    
    using namespace std;
    
    int startWinsock();
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr);
    
    SOCKET s;
    SOCKADDR_IN addr;
    char buf[256];
    
    int main()
    {
        int rc=0;
        rc=startWinsock();
        if(rc!=0)
        {
            cout<<"Winsock nicht gestartet"<<endl;
        }
        else
        {
            cout<<"Winsock gestartet"<<endl;
        }
    
        s=socket(AF_INET, SOCK_STREAM, 0);
        if(s==INVALID_SOCKET)
        {
            cout<<"Socket wurde nicht erstellt, Fehler: "<<WSAGetLastError()<<endl;
        }
        else
        {
            cout<<"Socket wurde erstellt"<<endl;
        }
    
        memset(&addr, 0, sizeof(SOCKADDR_IN));
        addr.sin_family=AF_INET;
        addr.sin_port=htons(12345);
        //addr.sin_addr.s_addr=inet_addr("127.0.0.1");
        rc=getAddrFromString("79.207.121.176", &addr);
        if(rc==SOCKET_ERROR)
        {
            cout<<"hat nich geklappt, fehlercode: "<<WSAGetLastError()<<endl;
        }
        else
        {
            cout<<"Das dings is erfolgreich"<<endl;
        }
    
        rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
        if(rc==SOCKET_ERROR)
        {
            cout<<"verbinden gescheitert, Fehler: "<<WSAGetLastError()<<endl;
        }
        else
        {
            cout<<"Verbunden mit "<<addr.sin_addr.s_addr<<endl;
        }
    
        while(rc!=SOCKET_ERROR)
      {
        printf("\nZeichenfolge eingeben [max 256]: ");
        gets(buf);
        send(s,buf,strlen(buf),0);
        rc=recv(s,buf,256,0);
        if(rc==0)
        {
          printf("Server hat die Verbindung getrennt..\n");
          break;
        }
        if(rc==SOCKET_ERROR)
        {
          printf("Fehler: recv, fehler code: %d\n",WSAGetLastError());
          break;
        }
        buf[rc]='\0';
        printf("\nServer antwortet: %s\n",buf);
        }
        closesocket(s);
        WSACleanup();
    
        cout<<"Verbindung unterbrochen"<<endl;
        system("pause");
    
        return 0;
    }
    
    int startWinsock()
    
    {
    
      WSADATA wsa;
    
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)
    
    {
    
      long rc;
    
      unsigned long ip;
    
      HOSTENT* he;
    
      /* Parameter prüfen */
    
      if(hostnameOrIp==NULL || addr==NULL) return SOCKET_ERROR;
    
      /* eine IP in hostnameOrIp ? */
    
      ip=inet_addr(hostnameOrIp);
    
      /* 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);
    
        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;
    
      }
    
    }
    

    würd mich freuen wenn ihr mir helfen könntet 😉

    MfG Daniel



  • Du musst höchstwahrscheinlich den entsprechende Port in der NAT-Firewall deines Freundes auf seinen PC weiterleiten.

    Les dir mal was zu den Grundlagen von Netzwerken (und vor allem Routern) durch.

    Der Code ist mir zu lang als das ich nur einen flüchtigen Blick drauf werfen würde.



  • warum einfach wenns auch kompliziert geht ... daran hab ich jetz garnich gedacht thx ^^


Anmelden zum Antworten