【发布时间】:2015-03-26 07:54:29
【问题描述】:
我正在使用 TCP 作为保持活动的机制,这是我的代码:
客户
TcpClient keepAliveTcpClient = new TcpClient();
keepAliveTcpClient.Connect(HostId, tcpPort);
//this 'read' is supposed to blocked till a legal disconnect is requested
//or till the server unexpectedly dissapears
int numberOfByptes = keepAliveTcpClient.GetStream().Read(new byte[10], 0, 10);
//more client code...
服务器
TcpListener _tcpListener = new TcpListener(IPAddress.Any, 1000);
_tcpListener.Start();
_tcpClient = _tcpListener.AcceptTcpClient();
Tracer.Write(Tracer.TraceLevel.INFO, "get a client");
buffer = new byte[10];
numOfBytes = _tcpClient.GetStream().Read(buffer, 0, buffer.Length);
if(numOfBytes==0)
{
//shouldn't reach here unless the connection is close...
}
我只放了相关代码...现在发生的情况是客户端代码在读取时按预期阻塞,但服务器读取立即返回 numOfBytes 等于 0,即使我重试在服务器上读取它立即返回......但客户端读取仍然是块!所以在服务器端,我错误地认为客户端与服务器断开连接,但客户端认为它连接到服务器......有人可以告诉它怎么可能吗?或者我的机制有什么问题?
编辑:失败后我将这些属性写入日志:
_tcpClient: _tcpClient.Connected=true
套接字:(_tcpClient.Client 属性)
_tcpClient.Client.Available=0
_tcpClient.Client.Blocking=true
_tcpClient.Client.Connected=true
_tcpClient.Client.IsBound=true
直播详情
_tcpClient.GetStream().DataAvailable=false;
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
什么
buffer.Length? -
@usr 我添加了缓冲区初始化...它的大小是 10
-
好的,这在正常情况下是不会发生的。打破常规思考问题。您是否连接到正确的端点?杀死服务器以确保。您是否意外关闭了 _tcpClient?顺便说一句,TCP keepalive 不能用于快速或可靠地检测断开连接。也许整个问题都没有实际意义。
-
我告诉你,这种机制大部分时间都有效,但 20 个连接中有 1 个的行为与我上面描述的一样。我确信我连接到正确的端点,我可以在日志中看到它,并且我确信我不会意外关闭 _tcpClient。这真是奇怪的行为,这就是我问这个问题的原因......也许有人有类似的经历......