【发布时间】:2012-10-26 10:29:14
【问题描述】:
在this MSDN Magazine August 2005 articleDaryn Kiely 中解释了构建 TCP 服务器的三种方法。
第三种模型,即异步模型,最适合我的需求,但我对其内部工作的一些细节有一些了解。
问题 1 - 关于接受连接的线程数
在示例中,当通过调用Start() 启动服务器时,代码会创建十个接受连接的线程池:
public void Start()
{
SetupServerSocket();
for (int i = 0; i < 10; i++)
_serverSocket.BeginAccept(AsyncCallback(AcceptCallback), _serverSocket);
}
我不明白为什么你不能只使用一个_serverSocket.BeginAccept,为什么数字十。
问题 2 – 大约收到零字节
在ReceiveCallback() 中,如果我们收到零字节,我们将关闭连接。为什么?当接收到零字节时总是认为客户端关闭了连接?在我在这里进行的测试中,当我的客户端关闭连接时,我得到一个异常,该异常被 SocketException 捕获。我在这里遗漏了什么吗?
问题 3 – 关于重新开始接收的需要
在套接字中接收到某些内容后,它会被放回 BeginReceive。为什么我们需要重新开始接收?这不应该是自动的吗?
问题 4 – 关于缓冲区大小
使用了 255 字节的缓冲区。我知道如果一条消息的长度大于缓冲区大小,它会在多个接收中分散。我应该设置一个足够大的缓冲区大小以保证不会有消息碎片化,还是必须提供代码来处理消息碎片化(将多个接收连接到一个缓冲区中)?
【问题讨论】:
-
回复:问题 4 - 即使您使用大缓冲区,也不能保证一侧发送和另一侧接收之间的任何匹配。编码的唯一安全方法是假设 any 消息,无论多么小,都可能是碎片化的。和/或任何
Receive可能会用来自多个消息的部分填充缓冲区
标签: c# networking tcp tcpserver