我有一个.NET TCP客户端,它向(.NET异步)TCP服务器发送大量消息。
我需要继续向服务器发送消息,但由于TIME_WAIT,我的客户端上的端口用完了。
如何在不使用所有可用端口的情况下持续可靠地发送消息?
是否有一种方法可以继续重用相同的套接字。我查看了Disconnect()和REUSEADDRESS套接字标志,但找不到它们使用的任何好例子。事实上,大多数消息来源都说不使用Disconnect,因为它是用于较低级别的使用(即它只回收套接字句柄)。
我在想我需要切换到UDP,或者是否有使用C ++和IOCP的方法?
答案 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))