2016-05-13 6 views
-1

Warum würde ein Socket in Verwendung Ausnahme für TcpClient(IPEndPoint) aber nicht TcpClient(String, Int32) geworfen werden?Warum sollte eine Socket in Use Ausnahme für TcpClient (IPEndPoint) aber nicht TcpClient (String, Int32) geworfen werden?

ich in meinem Code haben ein Zuhörer, die ich mit benutzen (ip ist :: 1, Port 12345 ist)

listener = new TcpListener(ip, port); //create listener 
listener.Start(); //start listener 
//now code will wait at the while loop until someone connects. 
while (listener.Pending()) { System.Threading.Thread.Sleep(1000); } //check for pending connections every second. 
client = listener.AcceptTcpClient(); //when incoming connection is found accept it. 

Beachten Sie, dass Code in einem Ich habe

in einer anderen Aufgabe Task listenerTask = Task.Run(() =>{}); ist die folgende

//client = new TcpClient(new IPEndPoint(ip, port)); //does not work 
client = new TcpClient("localhost", port); //localhost resolves to ::1 

Also, was ist das Geschäft? Was ist der Unterschied? Bin ich falsch, wenn localhost zu :: 1 auflöst? Wenn sich das nicht so auflöst, wie kann dann mein Programm auf sich selbst zurücksprechen?

Ich werde versuchen, in der Zwischenzeit weitere Informationen zu erhalten.

Ausnahmedetails:

System.Net.Sockets.SocketException was unhandled 
ErrorCode=10048 
HResult=-2147467259 
Message=Only one usage of each socket address (protocol/network address/port) is normally permitted 
NativeErrorCode=10048 
Source=System 
StackTrace: 
    at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) 
    at System.Net.Sockets.Socket.Bind(EndPoint localEP) 
    at System.Net.Sockets.TcpClient..ctor(IPEndPoint localEP) 
    at ConsoleApplication1.Program.Connector(IPAddress[] ips, Int32 port) 
+0

sieht aus wie Sie den gleichen Port versuchen, wieder zu verwenden, was nicht erlaubt ist. – Rahul

+0

Im Ressourcenmonitor sehe ich meine ConsoleApplication1.exe mit zwei Einträgen (wenn es funktioniert). Ein Eintrag hat den lokalen Port 12345 und den Remote-Port 63123, während der andere Eintrag den lokalen Port 63123 und den Remote-Port 12345 hat. @Rahul ist das, wovon Sie sprechen? – UpTide

+1

nicht sehr sicher, aber versuchen Sie es mit anderen Port insgesamt. – Rahul

Antwort

0

Mein Code:

client = new TcpClient(new IPEndPoint(ip, port)); 

Bindet den lokalen Port mit der lokalen IP-Adresse für später Verwendung.

einmal zu wissen, dies konnte ich mein Code wie folgt ändern und es funktioniert, wie ich es gedacht:

client = new TcpClient(new IPEndPoint(localIp, localPort)); //sets up how we are going to be connecting. 
client.Connect(remoteIp, remotePort); //does the real connecting. 

Quelle: https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient%28v=vs.110%29.aspx