首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置TCP套接字的本地端口?

如何设置TCP套接字的本地端口?
EN

Stack Overflow用户
提问于 2021-07-19 07:22:55
回答 1查看 801关注 0票数 0

为了在C#中设置TCP套接字,可以按以下方式使用System.Net.Sockets.Socket (用于开始连接):

代码语言:javascript
复制
_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):

代码语言:javascript
复制
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 
                                          cfg_DriverPort);
_socket.Bind(localEndPoint);

为什么是"127.0.0.1"?那是众所周知的本地主机IP地址。

但是,这似乎不起作用:在运行了之前的BeginConnect()之后:

代码语言:javascript
复制
_socket.BeginConnect(endpoint, OnConnect, _socket);

在“立即”窗口中输入? _socket.RemoteEndPoint时,我会得到这样的结果:

代码语言:javascript
复制
'_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提出的那样,但失败了:

代码语言:javascript
复制
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);

我尝试使用localipAddresstemp2 (我注意到localipAddress_socket.Connect()选择的那个不同,所以我想出了一种强制使用相同IPv4地址的方法(我不知道IPv6 4/IPv6 6是否与此有关,这只是强制地址的一种方式))。

老实说,我对这个请求的困难感到震惊:通常在远程IP地址和主机之间创建一个套接字,本地主机选择一个端口,并且在本地和远程端口之间建立连接,没有问题。

现在我只要求使用我自己选择的港口,这似乎是一个负担。为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-19 08:57:39

Socket.Bind()IPAddress.Any来拯救:

正如this other post中提到的,可以使用Socket.Bind(),但是为了实现这一点,必须填充IP地址。因此,可以使用IPAddress.Any

起初,这等于0.0.0.0,但是在执行Socket.Bind()时,会填充如下内容:

代码语言:javascript
复制
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, cfg_DriverRemotePort);
_socket.Bind(localEndPoint);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68436592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档