无法将TCP套接字绑定到测试IP地址的问题求助
问题描述
客户现场运行正常的代码如下:
private IPEndPoint GetCurrentServerIpAddress() { ... return new IPEndPoint(IPAddress.Parse("192.168.13.9"), 12714); } var IPAddress = GetCurrentServerIpAddress(); _socket.Bind(IPAddress);
为排查Bug,在本地Windows 10电脑测试时,将TCP套接字绑定到测试虚拟机IP10.1.0.60,修改后的代码:
private IPEndPoint GetCurrentServerIpAddress() { ... return new IPEndPoint(IPAddress.Parse("10.1.0.60"), 12714); } var IPAddress = GetCurrentServerIpAddress(); _socket.Bind(IPAddress);
运行时触发System.Net.Sockets.SocketException,错误提示:"The requested address is not valid in its context"。本地ipconfig结果如下:
Prompt>ipconfig Windows IP Configuration Ethernet adapter Ethernet 4: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Ethernet adapter Ethernet 2: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Ethernet adapter Ethernet: Connection-specific DNS Suffix . : company.int Link-local IPv6 Address . . . . . : fe80::4c66:9ac5:dbd0:656%25 IPv4 Address. . . . . . . . . . . : 10.1.3.19 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 10.1.3.254 Wireless LAN adapter Wi-Fi: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Wireless LAN adapter Local Area Connection* 1: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Wireless LAN adapter Local Area Connection* 2: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Ethernet adapter VMware Network Adapter VMnet1: Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe60::b53a:f868:31d0:e5a9%5 IPv4 Address. . . . . . . . . . . : 192.168.133.11 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : Ethernet adapter VMware Network Adapter VMnet8: Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe60::332e:9c68:4e2d:ceb7%27 IPv4 Address. . . . . . . . . . . : 192.168.42.11 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : Ethernet adapter Ethernet 3: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Ethernet adapter Talk2m-eCatcher: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Ethernet adapter Ethernet 9: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Ethernet adapter Ethernet 10: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . :
解决方法
核心原因:
Socket.Bind()只能绑定本地机器网卡上已存在的IP地址,你尝试绑定的10.1.0.60是虚拟机的IP,不属于本地网卡,因此报错。具体解决方案:
修改绑定地址为本地可用IP或通配地址
如果只是测试TCP消息发送,不需要绑定远程IP,修改代码绑定本地网卡IP(比如10.1.3.19),或者用通配地址IPAddress.Any(会自动适配所有本地网卡):private IPEndPoint GetCurrentServerIpAddress() { ... // 方案1:绑定通配地址,适配所有本地网卡 return new IPEndPoint(IPAddress.Any, 12714); // 方案2:绑定具体本地IP // return new IPEndPoint(IPAddress.Parse("10.1.3.19"), 12714); }发送TCP消息时,只需要在
Connect()方法中指定虚拟机的10.1.0.60:12714作为目标地址即可。确认本地与虚拟机的网络连通性
先在本地执行ping 10.1.0.60,检查是否能连通。如果不通:- 检查虚拟机的网络模式:若用NAT模式,需配置端口映射;若用桥接模式,确保虚拟机和本地机器在同一网段。
- 关闭本地和虚拟机的防火墙,或开放12714端口的TCP双向通信权限。
特殊场景:需绑定虚拟机IP的处理(极少用)
如果业务必须让本地程序使用虚拟机IP发送,可将该IP添加为本地网卡的别名:
以管理员身份打开命令提示符,执行:netsh interface ipv4 add address "Ethernet" 10.1.0.60 255.255.255.0添加完成后,本地网卡将拥有该IP,即可正常绑定。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

