Winsock Server über Internet erreichen



  • Hallo ich hab einen Winsock Server und einen Client dazu.

    Wenn ich den Server starte kann ich ihn über die PC IP 127.0.0.1 erreichen was aber wenn ich den Server über meine Internet IP ansprechen will ?

    Was muss man da machen damit das funktioniert ?

    Client:

    //Client
    
    #include <windows.h> //Required for socket init
    #include <iostream>
    using namespace std;
    
    //Client
    
    int main()
    
    {
    
    char buf2[256];
    
    string ip;
    long rc;
    char buf[256];
    int nret;
    
    SOCKET kSock;
    
    WSAData wsdata; 
    WORD wsver=MAKEWORD(2, 0);
    
    nret=WSAStartup(wsver, &wsdata);
    
    		if(nret != 0)
    		{
    		cout<<"Startup failed, error code: "<<WSAGetLastError();
    		WSACleanup();
    		return -1;
    		}
    
    cout<<"Init success\n";
    	 kSock=socket(AF_INET, SOCK_STREAM, 0);
    
    		if(kSock == INVALID_SOCKET)
    		{
    		cout<<"Socket init failed";
    		return -1;
    		}
    
    cout<<"Socket initialized\n";
    
    cout<<"IP eingeben: ";
    cin>>ip;
    
    sockaddr_in sin;
    sin.sin_port=htons(12345);
    sin.sin_addr.s_addr=inet_addr( ip.c_str() );
    sin.sin_family=AF_INET;
    
    	 rc = connect(kSock,(sockaddr*)&sin, sizeof(sin));
    
    	   if(rc==SOCKET_ERROR)
    			{ //Check the condition
    			cout<<"Connect failed, error: "<<WSAGetLastError(); //Returns error code
    			WSACleanup();
    			return -1;
    			}
    
    	else
    	{
    	cout<<"Connection successful!\n";
    	}
    
     while(rc!=SOCKET_ERROR)
      {
       cout<<"\nZeichenfolge eingeben [max 256]: ";
       cin>>buf;
       send(kSock,buf,strlen(buf),0);
    
       recv(kSock, buf2, strlen(buf2), 0);
       cout<<"Server Antwortet: "<<buf2;
    
       }
    
    	rc=recv(kSock,buf,256,0);
    	if(rc==0)
            {
    	  cout<<"Server hat die Verbindung getrennt..\n";
    	  return 0;
    	  return 0;
    	}
    
        if(rc==SOCKET_ERROR)
        {
    	  cout<<"Fehler: recv, fehler code: "<<WSAGetLastError();
    	 return 0;
    	  return 0;
    	}
    
               buf[rc]='\0';
    
    closesocket(kSock);
    return 0;
    }
    

    Server:

    #include <windows.h> //Required for socket init
    #include <iostream>
    using namespace std;
    
    //server
    int main()
    {
    
    char buf2[]="test";
    long rc;
    SOCKET kSock;
    SOCKET client;
    int len;
    
    char buf[256];
    
    WSAData wsdata;
    WORD wsver=MAKEWORD(2, 0); //We want Winsock 2.0
    int nret=WSAStartup(wsver, &wsdata); //Pass version 2.0 and pointer to implement
    
    		if(nret != 0)
    		{
    		cout<<"Startup failed, error code: "<<WSAGetLastError();
    		WSACleanup();
    		return -1;
    		}
    
    cout<<"Init success\n";
    kSock=socket(AF_INET, SOCK_STREAM, 0);
    
    		if(kSock == INVALID_SOCKET)
    		{
    		cout<<"Socket init failed";
    		return -1;
    		}
    
    cout<<"Socket initialized\n";
    sockaddr_in sin;
    sin.sin_port=htons(12345);
    sin.sin_addr.s_addr=INADDR_ANY;
    sin.sin_family=AF_INET;
    
    		if(bind(kSock,(sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
    		{
    		cout<<"Failed to bind\n";
    		WSACleanup();
    		return -1;
    		}
    
    cout<<"Bind successful!\n";
    
      rc=listen(kSock,10);
    
      if(rc==SOCKET_ERROR)
      {
            cout<<"Error "<<GetLastError();
    	system("PAUSE");
    	return 0;
      }
    
      else
      {
        cout<<"acceptSocket ist im listen Modus....\n";
      }
    
    	// Verbindung annehmen
    	 client=accept(kSock,NULL,NULL);
    
    	if(client==INVALID_SOCKET)
            {
            cout<<"Fehler: accept, fehler code: <<"<<WSAGetLastError();
    	return 1;
    	}
    
    	 cout<<"Neue Verbindung wurde akzeptiert!\n";
    
       // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
    
                           send(client,buf2,strlen(buf2),0);
                           rc=recv(client,buf,256,0);
    
    				if(rc==0)
    				{
    					cout<<"Server hat die Verbindung getrennt..\n";
    					system("PAUSE");
    					return 0;
    				 }
    
    			if(rc==SOCKET_ERROR)
    		        {
    			  cout<<"Fehler: recv, fehler code: "<<WSAGetLastError();
    			  break;
    		       	}
    
                    buf[rc]='\0';
    
    		cout<<"Client sendet: "<<system(buf);
                    cout<<"\n";
    
      }
    
    closesocket(client); //Close both socket handles
    closesocket(kSock);
    WSACleanup();
    return 0;
    }
    


  • srv schrieb:

    Hallo ich hab einen Winsock Server und einen Client dazu.

    Wenn ich den Server starte kann ich ihn über die PC IP 127.0.0.1 erreichen was aber wenn ich den Server über meine Internet IP ansprechen will ?

    Was muss man da machen damit das funktioniert ?

    Falls Dein Server hinter einem Router sitzt, mußt Du den entsprechenden Port auf die richtige LAN-IP forwarden, falls nicht, mußt Du gar nix machen ...



  • Belli schrieb:

    Falls Dein Server hinter einem Router sitzt, mußt Du den entsprechenden Port auf die richtige LAN-IP forwarden, falls nicht, mußt Du gar nix machen ...

    Vergessen: Falls Du noch eine FireWall - Software auf Deinem Rechner laufen hast, muß diese natürlich auch Anfragen auf dem entsprechenden Port durchlassen.



  • ok danke


Log in to reply