Avatar billede spif2001 Nybegynder
09. august 2005 - 08:21 Der er 23 kommentarer og
1 løsning

En TcpClients IPAdresse - hvordan?

Jeg har følgende kode. En TcpListener der lytter efter/snakker med TcpClient's:

//Find local IPAddress
System.Net.IPHostEntry hostEntry = System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName());
string ipString = hostEntry.AddressList.GetValue(0).ToString();

//Create and start TcpListener
int portNumber = 12345;
TcpListener srv = new TcpListener(IPAddress.Parse(ipString), portNumber);
srv.Start();

try
{
    //Listen for incomming client calls
    while(true)
    {
        TcpClient cli = srv.AcceptTcpClient();

        ClientHandler tch = new ClientHandler(cli, this.owner);
        Thread comThread = new Thread(new ThreadStart(tch.Run));
        comThread.IsBackground = true;
        comThread.Start();
    }
}

Nu vil jeg meget gerne have TcpClientens IPAdresse, da jeg skal bruge den til en logfil - hvordan får jeg lige fat i den, da der ikke er nogen IPAdresse attribut på TcpClient objektet?
Avatar billede Syska Mester
09. august 2005 - 08:30 #1
En mulighed kunne jo være at sende den til serveren fra klienten....

// ouT
Avatar billede spif2001 Nybegynder
09. august 2005 - 08:32 #2
hæhæ - jaa - men den protokol er allerede på plads, så den går ikke rigtigt.
Avatar billede anadan Nybegynder
09. august 2005 - 09:44 #3
TcpClient har en protected property Client (af typen Socket), der har en property RemoteEndPoint (der indeholder ipadressen). Du kan enten override TcpClient og så give mulighed for at få fat i Client propertien, eller bare bruge Socket istedet for TcpClient (TcpListener.AcceptSocket())
Avatar billede arne_v Ekspert
09. august 2005 - 09:51 #4
Eller gå på .NET 2.0, fordi der er .Client property nemlig public
Avatar billede spif2001 Nybegynder
09. august 2005 - 10:42 #5
anadan -> Vil gerne bruge override TcpClient metoden, men jeg kan ikke lige se hvordan. Kan du give et eksempel?
Avatar billede Syska Mester
09. august 2005 - 11:02 #6
Kun et gæt, men skal du ikke bare arve fra TcpClient, og så lave din egen motode til at hente Ip addressen ud....
Avatar billede Syska Mester
09. august 2005 - 11:03 #7
altså fra den protected property

// ouT
Avatar billede spif2001 Nybegynder
09. august 2005 - 11:06 #8
Mit problem er, at når jeg laver følgende:

TcpClient cli = srv.AcceptTcpClient();

så returnerer srv.AcceptTcpClient() en TcpClient og jeg kan derfor ikke lave en MyTcpClient typecast på følgende måde, da jeg ellers får en Runtime typecast error:

MyTcpClient cli = (MyTcpClient)srv.AcceptTcpClient();

Min MyTcpClient er bare som følger:

using System;
using System.Net;
using System.Net.Sockets;

namespace SocketCollecter
{
    public class MyTcpClient : TcpClient
    {
        public MyTcpClient()
        {
        }

        public EndPoint GetClientRemoteEndPoint()
        {
            return base.Client.RemoteEndPoint;
        }
    }
}
Avatar billede Syska Mester
09. august 2005 - 11:08 #9
AcceptTcpCleint skal vel også vide at den skal returnere en "MyTcpCleint", jeg skal ikke gøre mig klog på det, men mon ikke arne eller anadan kan :-)

// ouT
Avatar billede spif2001 Nybegynder
09. august 2005 - 11:11 #10
nemlig - men det kan jeg jo ikke rigtig lave om på :)
Avatar billede arne_v Ekspert
09. august 2005 - 11:25 #11
desværre

accept en socket

eller vent på 2.0
Avatar billede anadan Nybegynder
09. august 2005 - 11:27 #12
Der var jeg vist for hurtig...
Hvad med at hive property'en ud via noget Reflection?

noget i retning af client.getType().InvokeMember("Client", ...

Har ikke lige rodet så meget med det, ved ikke om man kan få fat i protected properties på denne måde.

Ellers kan du bruge noget managed C++, beskrevet her : http://www.codeproject.com/managedcpp/get_the_ip_out_tcpclient.asp
Avatar billede spif2001 Nybegynder
09. august 2005 - 11:59 #13
det er da også noget fis, at den property er protected. For hunden da...

Nå - så må jeg vel hellere lave det om til Socket.

Hmmm... men hvem skal have point?

En deler mellem alle 3?
Avatar billede anadan Nybegynder
09. august 2005 - 12:05 #14
ingen til mig, tak
Avatar billede arne_v Ekspert
09. august 2005 - 12:57 #15
ja - jeg kan godt forstå at de har fixet den i 2.0

umiddelbart synes jeg jo at det er anadans point, fordi accept socket er
nok det rigtige svar
Avatar billede spif2001 Nybegynder
09. august 2005 - 13:00 #16
øhm - han vil jo ikke have :)
Avatar billede Syska Mester
09. august 2005 - 13:21 #17
Mine er kun kommentare mere for at finde ud af om jeg måske også kunne hjælpe lidt :-P

Synes Anadan skal have point eller også bare selv snuppe dem igen.

// ouT
Avatar billede anadan Nybegynder
09. august 2005 - 13:32 #18
nup dem selv :)
Avatar billede spif2001 Nybegynder
09. august 2005 - 13:34 #19
ok - det gør jeg så :) - du får lidt karma i stedet - hæhæ
Avatar billede anadan Nybegynder
09. august 2005 - 13:49 #20
sweet :) jeg er bare ikke meget for at få point for en halv løsning.. Det oprindelige spørgsmål var jo IPAdressen for en TCPClient, og det kan man ikke, så jeg ser det ikke som et svar.
Avatar billede arne_v Ekspert
09. august 2005 - 19:48 #21
det er kotyme at give point for "det kan ikke lade sig gøre" - ihvertfald
hvis det er nogenlunde begrundet
Avatar billede spif2001 Nybegynder
10. august 2005 - 09:45 #22
--> arne_v
?? - du mener, at siden anadan afslår point, så går de til den næste i køen? Og siden buzzzz ligeledes afslog, så er den eneste tilbage i køen dig.

Jeg tog ikke pointene tilbage for at spare dem. Hvis du mener du skal have pointene, så bare sig til, så opretter jeg et nyt spørgsmål.
Avatar billede arne_v Ekspert
10. august 2005 - 09:51 #23
slet ikke - jeg synes bare at anadan skulle have taget imod dem med god samvittighed
Avatar billede anadan Nybegynder
10. august 2005 - 09:56 #24
Jeg ville selv have det mærkeligt med at give point for "ubesvarede" spørgsmål, og desuden samler jeg ikke på point. Men nu da det er kotyme vil jeg da give pointene, men lade være med at modtage.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester