为了在C#中设置TCP套接字,可以按以下方式使用System.Net.Sockets.Socket (用于开始连接):
_socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPEndPoint endpoint = new IPEndPoint(Ip, Port);
_socket.BeginConnect(endpoint, OnConnect, _socket);这将创建一个套接字连接,endpoint是远程端点,本地端点将自动创建(IP地址将从.检索,端口似乎是随机选择的)。
为了修复本地端口,我尝试了以下方法(松散地基于this other post):
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),
cfg_DriverPort);
_socket.Bind(localEndPoint);为什么是"127.0.0.1"?那是众所周知的本地主机IP地址。
但是,这似乎不起作用:在运行了之前的BeginConnect()之后:
_socket.BeginConnect(endpoint, OnConnect, _socket);在“立即”窗口中输入? _socket.RemoteEndPoint时,我会得到这样的结果:
'_socket.RemoteEndPoint' threw an exception of type
'System.Net.Sockets.SocketException'
Data: {System.Collections.ListDictionaryInternal}
ErrorCode: 10057
HResult: -2147467259
HelpLink: null
InnerException: null
Message: "A request to send or receive data was disallowed because
the socket is not connected and
(when sending on a datagram socket using a sendto call)
no address was supplied"
NativeErrorCode: 10057
SocketErrorCode: NotConnected
Source: "System"
StackTrace: " at System.Net.Sockets.Socket.get_RemoteEndPoint()"
TargetSite: {System.Net.EndPoint get_RemoteEndPoint()}那么,有人知道如何设置套接字的本地端口吗?(我认为使用"127.0.0.1“的技巧是个坏主意,但我不喜欢在所有的网络接口中运行(我甚至不知道该选择哪一个)。
编辑
我尝试过this answer的解决方案,就像Marc提出的那样,但失败了:
IPEndPoint endpoint = new IPEndPoint(Ip, Port);
IPAddress localipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
var temp = Dns.GetHostEntry(Dns.GetHostName()).AddressList;
var temp2 = temp.First(add => add.AddressFamily != AddressFamily.InterNetworkV6);
IPEndPoint localEndPoint = new IPEndPoint(temp2, parent.cfg_DriverRemotePort);
_socket.Bind(localEndPoint);我尝试使用localipAddress和temp2 (我注意到localipAddress与_socket.Connect()选择的那个不同,所以我想出了一种强制使用相同IPv4地址的方法(我不知道IPv6 4/IPv6 6是否与此有关,这只是强制地址的一种方式))。
老实说,我对这个请求的困难感到震惊:通常在远程IP地址和主机之间创建一个套接字,本地主机选择一个端口,并且在本地和远程端口之间建立连接,没有问题。
现在我只要求使用我自己选择的港口,这似乎是一个负担。为什么会这样呢?
发布于 2021-07-19 08:57:39
Socket.Bind()和IPAddress.Any来拯救:
正如this other post中提到的,可以使用Socket.Bind(),但是为了实现这一点,必须填充IP地址。因此,可以使用IPAddress.Any。
起初,这等于0.0.0.0,但是在执行Socket.Bind()时,会填充如下内容:
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, cfg_DriverRemotePort);
_socket.Bind(localEndPoint);https://stackoverflow.com/questions/68436592
复制相似问题