3

我有一个 .NET TCP 客户端,它向(.NET 异步)TCP 服务器发送大量消息。

我需要继续向服务器发送消息,但由于 TIME_WAIT,我用完了客户端上的端口。

程序如何在不使用所有可用端口的情况下持续可靠地发送消息?

有没有办法继续重用同一个套接字。我查看了 Disconnect() 和 REUSEADDRESS 套接字标志,但找不到任何使用它们的好例子。事实上,大多数消息来源都说不要使用 Disconnect,因为它是用于较低级别的使用(即它只回收套接字句柄)。

我在想我需要切换到 UDP 还是有使用 C++ 和 IOCP 的方法?

4

6 回答 6

5

如果您的服务器和客户端知道数据的格式,您可以保持套接字打开。您正在关闭套接字,以便服务器可以“看到”客户端“完成”。

如果您有一些协议,那么服务器可以“知道”它何时完成接收数据块。

您可以查找某种消息结束标记,您可以传入消息的长度,并根据大小等读取其余部分。不同的方法。

但是没有理由不断地打开和关闭与服务器的连接——这就是你要死的原因。

于 2008-10-01T18:18:40.030 回答
1

您的客户端可以保持相同的套接字打开并循环发送消息吗?

open socket connection

while(running)
    send messages over socket

close socket connection
于 2008-10-01T15:24:34.397 回答
1

TCP 非常努力地防止网络拥塞。所有新的 TCP 连接都以“慢启动”状态开始,它们只发送一个数据包并等待来自另一端的确认。如果收到 ACK,TCP 将发送两个数据包,然后是四个,以此类推,直到达到其最大窗口大小。

如果您正在以高数据速率生成消息,您确实希望避免打开和关闭 TCP 连接。每次打开新连接时,您都会回到慢启动状态。如果您可以保持套接字打开,则 TCP 连接将通过慢启动状态并能够以更高的速率发送数据。

为此,您需要让服务器在一个连接上处理多个消息(这意味着要找到一种方法来描述每条消息)。如果您的服务器支持任何类型的 HTTP 编码,这将起作用;确保检查与“持久”连接或 HTTP 1.1 相关的任何参数或配置,因为这是 HTTP 通过单个 TCP 连接发送多个请求的方式。

您提到的一种选择是UDP。如果您以相当高的速率生成消息,您可能会丢失其中的一些消息,因为沿途某处队列已满。如果您发送的消息需要可靠,UDP 可能不是一个好的基础。

于 2008-10-01T18:51:01.280 回答
0

编写 TCP 服务器(用任何语言)背后的基本思想是打开一个端口来监听连接,然后创建新线程或进程来处理新的连接请求。

open a server socket // this uses the port the clients know about

while(running)
    client_socket = server_socket.listen
    fork(new handler_object(client_socket))

这是C# 中的一个很好的例子

于 2008-10-01T18:13:44.833 回答
0

当这样编码时,它不起作用。

服务器只接收第一条消息。

当我打开和关闭套接字时,服务器可以工作,但我的客户端端口用完了。

我猜这是我的服务器的设计导致我不得不像这样编写客户端。

那么如何使用 .NET 编写异步服务器。我已经关注了 MSDN 示例和许多在线示例。

于 2008-10-01T15:49:30.623 回答
0

类似于消息队列服务的东西会对您的项目有益吗?这样,您的客户端可以将尽可能多的消息传递给您的服务器,并且您的服务器可以简单地从队列中拉出这些消息,尽可能快地尽可能快,如果您的客户端发送的消息超出了它的处理能力,它们会很简单进入队列等待处理。

一些快速的谷歌搜索发现了这个MSDN 文档,关于使用 C# 构建消息队列服务

于 2008-10-01T17:14:13.260 回答