TClientSocket, Internet-IP ?



  • hi,
    also ich bin dabei ein chat pool zu coden, nur hab ich das prob:

    wenn die clients in einem lokalen netzwerk betrieben werden, sendet das TClientSocket mit LocalAdresse die lokale ip (192.186...), ich brauch aber die InternetIP, wie find ich die raus?



  • hier musst halt so umschreiben das der lokale ip Adressen (192.168.xxx.xxx , 10.xxx.xxx.xxx usw) rausfiltert und nur die richtigen anzeigt(könnten ja mehrere sein) und das er nicht in eine Stringlist schreibt sondern halt so nen AnsiString oder wasweissich zurückgibt:

    int getmyips(TStrings* pslStrings)
    {
      if(pslStrings) pslStrings -> Clear();
      WSAData stData;
      char caHostName[255];
      hostent* pstHostEntry = NULL;
      in_addr stInetAddress;
      int ilRetVal = 0;
    
      // Winsock initialisieren:
      if(WSAStartup(0x0101, &stData) == 0)
      {
        // Hostnamen bestimmen:
        if(gethostname(caHostName, 255)) return 0;
        // Hostinformationen abrufen:
        pstHostEntry = gethostbyname(caHostName);
        if(pstHostEntry == NULL) return 0;
    
        // IP-Adressen bestimmen:
        for(int ilAddrIndex=0; pstHostEntry->h_addr_list[ilAddrIndex]; ilAddrIndex++)
        {
          stInetAddress.S_un.S_addr =
            *((DWORD*)pstHostEntry->h_addr_list[ilAddrIndex]);
          if(pslStrings != NULL)
            pslStrings -> Add(inet_ntoa(stInetAddress));
          ilRetVal++;
        }
      }
      else return 0;
      WSACleanup();
      return ilRetVal;
    }
    


  • @dreaddy: dürfte wohl kaum das bewirken, was "TheClient" wünscht.

    @TheClient: Damit bist du ganz klar das "Opfer" von IP Masquerading (da du ja scheinabr über eine Router ins I-Net gehst) Hier lässt sich die externe IP nur von Aussen bestimmen. (Serverseitig zum Beispiel gibt es eine Eigenschaft dafür)

    Allerdings kannst du dieses Verhalten auch zu deinem Vorteil ausnutzen, indem du eine Kombination aus Öffnetlicher IP und Lokaler IP als Identifikation des Users benutzt oder so (:

    -junix



  • ich dann nix versteh Problem 😞

    wenn man einen Chat baut und im lokalen Netzwerk betreibt hat man nur die lokale IP wenn man sich den Socket auseinandernimmt..

    wenn eine Internetverbindung besteht, zeigt die Funktion oben die an und man kann sie rausfiltern und anzeigen......

    hmm... andrerseits wenn ich mir den Post jezt verwirrterweise zum 10ten mal durchlese entdecke ich das wort Clients im lokalen Netzwerk und interpretiere das der Server im Inet steht ^^ könnte aber trotzdem klappen naja laut Junix ja nicht und Junix hat immer Recht 😞

    @Junix wenn man IP nur serverseitig bestimmen kann wie bekommt ipconfig das dann hin? =[ ich glaub nicht das Microsoft einen Ipconfiganfrageserver irgendwo stehen hat



  • Ipconfig bekommt das auch nicht hin. Für deinen Client im lokalen Netz, der über einen Router/Gateway in's Internet geht, zeigt ipconfig auch nur die lokale IP an, nicht die öffentliche des Routers.



  • okok einen Versuch hab ich noch =[ wie bekommt das Spiel Dungeon Siege das hin die IP anzuzeigen bevor eine Verbindung mit dem Peer to Peer Partner hergestellt wird?



  • Hast du denn eine Modem verbindung oder gehst du über Netzwerkkarten und Router ins I-Net?

    -junix



  • ich über netzwerkkarte und DSL ^^ also direkt aber ich weiss von Kumpel das die IP des Routers(!) bei DS direkt angezeigt wird



  • und was gibt dir da IPConfig zurück?

    -junix



  • also, der chat server steht im internet,
    und wenn clients über ein lokales netzwerk connecten möchten, geht das nicht, weil ich im server die user mit nickname und ip (die der client dem Server zusendet) registriert. in diesem fall sendet er dann seine private ip.
    wie soll der server dann nickname und ip verknüpfen, weil ich will auch messages nur an explizit definierte clients (also nicht immer an alle) senden.

    [ Dieser Beitrag wurde am 09.07.2002 um 16:23 Uhr von TheCient editiert. ]



  • Siehe Post weiter oben in dem ich vorgeschlagen hatte die empfangene IP vom Client (welche übers protokoll den Weg gefunden hat) und die, welche der Socket tatsächlich erhalten hat in irgend einer Weise zu verknüpfen.

    -junix



  • ich schua mal

    wie läuft das eigentlich mit den Socket->Connections[x],
    bekommt jede verb. eine ewige index-nr (x) oder wird alles, wenn einer geht nach oben verschoben? oder bleibt x gleich solange er connected ist?

    [ Dieser Beitrag wurde am 09.07.2002 um 18:48 Uhr von TheCient editiert. ]



  • aber ich weiss von Kumpel das die IP des Routers(!) bei DS direkt angezeigt wird

    Der lokale Client verbindet sich über den Router mit dem DS-Server, dieser sieht die öffentliche IP des Routers und gibt sie an den Client zurück, wo sie dann im Spiel angezeigt wird.



  • ich möchte das mein vorheriger post in diesem thread nicht vergessenheit gerät, weis jemand bescheid?



  • ...nur damit meine erste Antwort nicht in vergessenheit gerät, was passt dir an meinem Vorschlag nicht?

    -junix



  • ? ich meine diesen teil meines gemeinten posts, ich glaube darauf hast du noch nichts geschrieben:

    ---- kopiert ---
    wie läuft das eigentlich mit den Socket->Connections[x],
    bekommt jede verb. eine ewige index-nr (x) oder wird alles, wenn einer geht nach oben verschoben? oder bleibt x gleich solange er connected ist?
    ---- kopiert ---



  • Oh sorry, das hab ich gar nicht gesehen, weils zwischen die beiden OT-Beiträge eingeschoben war 🙄 Mein fehler.

    Nein, x ist einfach ein Index eines Arrays oder Vecotrs. Wenn du die verbindung schliesst sollte (sofern ich das noch richtig im Kopf hab) eigentlich alles eins nachrutschen und der Connections-Zähler um eins dekrementiert werden.

    Allerdings hast du irgendwo bei den Eigenschaften der Sockets noch eine RemoteAddress die du auslesen kannst. Dieses Attribut gibt dir die öffentliche IP zurück.

    Sorry nochmals.

    -junix



  • Original erstellt von Jansen:
    **aber ich weiss von Kumpel das die IP des Routers(!) bei DS direkt angezeigt wird

    Der lokale Client verbindet sich über den Router mit dem DS-Server, dieser sieht die öffentliche IP des Routers und gibt sie an den Client zurück, wo sie dann im Spiel angezeigt wird.**

    so hab ich mir das ja auch gedacht, aber die Adresse wird bei einer direkten Verbindung ohne Server usw angezeigt und zwar bevor man sich mit dem anderen verbunden hat, das wundert mich ja grade 😑 .......

    achn TheClient wieso machst DU das nicht so 😛 also jeder der sich in Chat einloggt bekommt seine IP(also RemoteHost vom Server aus abgefragt) zugeschickt



  • die Adresse wird bei einer direkten Verbindung ohne Server usw angezeigt und zwar bevor man sich mit dem anderen verbunden hat

    Kann ich mangels Spiel schlecht ausprobieren, möglicherweise wird die von der letzten Verbindung gespeichert? Oder es wird doch schon vor der eigentlichen Verbindungsaufnahme ein Server abgefragt. Prinzipiell gibt es einfach keine Möglichkeit, "von innen" die öffentliche IP eines Routers ausfindig zu machen.



  • @junix, stimmt dann dieses beispiel?

    array:
    Socket->Connections[0]->RemoteAdress (80.1.1.1)
    Socket->Connections[1]->RemoteAdress (80.1.1.2)
    Socket->Connections[2]->RemoteAdress (80.1.1.3)

    array nach dem 80.1.1.1 disconnected:
    Socket->Connections[0]->RemoteAdress (80.1.1.2)
    Socket->Connections[1]->RemoteAdress (80.1.1.3)
    Socket->Connections[2]->RemoteAdress (NULL)

    ---------------------------------------------------
    Noch was, wo finde ich diesen Connections-Zähler?


Anmelden zum Antworten