高容量TCP客户端的设计

时间:2008-10-01 15:17:10

标签: tcp timeout client volume

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

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

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

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

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

6 个答案:

答案 0 :(得分:5)

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

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

你可以查找somekind的消息结束标记,你可以传入消息的长度,然后根据大小等来阅读其余标记。不同的方法。

但没有理由不断打开和关闭与服务器的连接 - 这就是在这里杀死你的。

答案 1 :(得分:1)

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

open socket connection

while(running)
    send messages over socket

close socket connection

答案 2 :(得分:1)

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

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

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

您提到的一个选项是UDP。如果您以相当高的速率生成消息,由于队列在整个过程中的某个位置已满,您可能会丢失其中一些消息。如果您发送的消息需要可靠,UDP可能不是一个好的基础。

答案 3 :(得分:0)

编码时,它不起作用。

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

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

我猜这是我服务器的设计导致我必须像这样对客户端进行编码。

那么如何使用.NET编写Async服务器代码。我已经在线跟踪了MSDN示例和大量示例。

答案 4 :(得分:0)

消息排队服务的某些方面是否有益于您的项目?通过这种方式,您的客户端可以将尽可能多的消息传递到您的服务器,您的服务器可以简单地从队列中提取这些消息,并尽可能快地将消息从您的服务器中提取出来,如果您的客户端发送的消息超出了它的处理能力,那么进入队列并等待处理。

一些快速的Google搜索显示了MSDN documentation on building a message queuing service with C#

答案 5 :(得分: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))

这是a good example in C#