【发布时间】:2018-01-14 21:29:34
【问题描述】:
我正在尝试使用 .NET 的TcpClient 连接到 TCP 服务器。为了测试,服务器在我自己的机器上。它最初有效,但在我重新启动应用程序时无效。
所以我写了一小段代码来尝试连接/断开连接两次,但我不知道我做错了什么:
const int clientPort = 29501;
const int port = 29500;
using (var client = new TcpClient(new IPEndPoint(IPAddress.Loopback, clientPort)))
client.Connect(IPAddress.Loopback, port);
using (var client = new TcpClient(new IPEndPoint(IPAddress.Loopback, clientPort)))
client.Connect(IPAddress.Loopback, port);
当我运行这段代码时,我得到一个SocketException:
每个套接字地址(协议/网络地址/端口)通常只允许使用一次
我做错了什么? using 块不应该正确释放套接字吗?
【问题讨论】:
-
您的本地连接不能共享相同的本地端口。
-
@Amy 但是
using应该在新端口启动之前断开与该端口的最后一个连接,对吧? -
Dispose()只是告诉 GC 该对象可用于收集。它不会立即强制垃圾回收,因此不会立即导致连接关闭。 -
查看
LingerState,在调用Close后,您的连接可能保持打开状态。我还要指出,您没有必须为客户端指定要绑定的端点 - 您可以将其省略并 one will be generated for you,因此除非您确实需要绑定两个客户端到同一个端口,让系统给你分配一个空闲端口更安全。 -
为什么你要这样做?为什么要从特定的客户端端口连接?无论如何,端口在使用后将处于等待状态,请参阅副本。您不能这样做,只能将 TIME_WAIT 间隔配置为非常低的值 (which you don't want to),或者要求操作系统的 TCP/IP 堆栈完成其工作并为您分配一个空闲的客户端端口。