2016-06-30 4 views
1

Ich habe eine laufende Anwendung, die Socket-Kommunikation verwendet, um eine Verbindung zu einem Server auf einem Port herzustellen. Ich habe diese Anwendung von Framework 2.0 (Visual Studio) bis zum Framework 4.5 portiert, wobei alle Intermediate-Frameworks ohne Probleme durchlaufen wurden.TCP-Client kann nicht an Port 0 im Socket mit Framework 4.6.1 binden

Jetzt, mit Visual Studio 15 und Framework 4.6.1, verbindet sich der Socket nicht mehr. In den Code suchen, fand ich heraus, dass das Problem war socket.Bind, die eine Ausnahme ausgelöst, wenn der lokale Port 0 ist. Es ist erwähnenswert, dass in der Regel keine Notwendigkeit, Ihren lokalen Port zu binden, aber wenn Sie mehrere Netzwerkadapter haben , und der Server erlaubt nur einer Ihrer IPs eine Verbindung herzustellen, Sie müssen den Adapter (oder die IP) binden, den der Socket verwenden muss, um seine Verbindung herzustellen, andernfalls verwendet der Socket entweder eine zufällige IP oder die auf der oben. Das Kommentieren der 'Bindung' funktioniert gut, aber wir verlieren die Möglichkeit, andere lokale IPs für die Verbindung anzugeben. Leider ist meine IP nicht die standardmäßig ausgewählte, so dass ich nicht mehr in der Lage bin, eine Verbindung in Framework 4.6.1 herzustellen.

Kann jemand mit einer Lösung dafür helfen?

// IPEndPoint is the local IP to use for connection. Port 0 means random port 
IPEndPoint localHost = new IPEndPoint(IPAddress.Parse("123.xxx.xxx.126"), 0); 

// now we bind to force the socket to use the provided IP in IPEndPoint 
_socket.Bind(localHost); 

// Finally, we connect to the server using the bound IP and Port (random) 
_socket.Connect("123.xxx.xxx.130",8080); 

_socket.Bind will throw the following error (only in fw 4.6.1) 

{ "Die angeforderte Adresse ist in seinem Kontext ungültig"} Native Error Code: 10049

Und natürlich nicht viel Hilfe auf Fehler 10049 auf Sockeln, wenn es als Client verwendet .

+0

Sind Sie sicher, dass die IP-Adresse für den lokalen Endpunkt gültig ist? Ist es der Port, mit dem du dich beschäftigst, oder die IP? Funktioniert es, wenn Sie an eine feste Port-Nummer statt an zufällige binden? – leetibbett

+0

Die IP ist gültig. Ich verwende den gleichen Code auf dem gleichen Client, nur das Framework hat sich geändert. ** Ist es der Port, den Sie betroffen sind oder die IP? ** Ich kann nicht sagen, die Socket.Bind schlägt fehl, wenn ich es nenne. ** Funktioniert es, wenn Sie an eine feste Port-Nummer statt an zufällige binden? ** Nein, alle Aufrufe zum Binden erzeugen einen Fehler. –

Antwort

0

ersetzen:

IPEndPoint localHost = new IPEndPoint(IPAddress.Parse("123.xxx.xxx.126"), 0); 

Mit

IPEndPoint localHost = new IPEndPoint(IPAddress.Any, 0); 
+0

Wie bereits erwähnt, bedeutet die Verwendung von 'IPAddress.Any' von einer clientseitigen Verbindung aus, dass 'Any' IP für die Verbindung verwendet wird. Sie können jedoch nicht angeben, welche LOCAL IP für die Verbindung verwendet werden soll. Wenn Sie viele lokale IPs (multi-homed) haben und nur 1 auf einen externen Server in der Whitelist gesetzt ist, werden Sie gezwungen, die weiß gelistete IP mit 'socket.Bind' zu binden, was eine Ausnahme in Framework 4.6 erzeugt. 1. Die generierte Ausnahme stammt nicht von der angegebenen IP, sondern von der Angabe von Port 0, vermute ich. –

Verwandte Themen