【问题标题】:Can't connect to same local TCP server twice [duplicate]无法两次连接到同一个本地 TCP 服务器 [重复]
【发布时间】: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 堆栈完成其工作并为您分配一个空闲的客户端端口。

标签: c# .net sockets tcp


【解决方案1】:

正如您在MSDN 中看到的,使用带有IPEndPoint 类型参数的构造函数也绑定到该指定端口。在您的情况下,您不需要客户端绑定到另一个端口,只有服务器套接字必须绑定到 TCP 端口。

所以你可以改用无参数构造函数:

const int port = 29500;

using (var client = new TcpClient())
    client.Connect(IPAddress.Loopback, port);

using (var client = new TcpClient())
    client.Connect(IPAddress.Loopback, port);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 2014-04-05
    • 1970-01-01
    • 2017-12-09
    • 2017-02-24
    • 2019-12-19
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多