gpt4 book ai didi

c# - 奇怪的tcp连接场景

转载 作者:可可西里 更新时间:2023-11-01 02:45:20 24 4
gpt4 key购买 nike

我使用 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;

最佳答案

即使正确实现,这种方法也只能检测到一些远程服务器故障。考虑中间网络将两台机器分开的情况。然后,只有当底层 TCP 堆栈发送传输层保活时,系统才会检测到故障。 Keepalive是对问题的很好描述。 [TCP 套接字连接是否具有“保持事件状态”?] 2是一个伴随问题。 RFC表示该功能是可选的。

唯一可靠地确认对方还活着的方法是偶尔在两个端点之间发送实际数据。这将导致 TCP 及时检测到故障并将其报告回应用程序。

关于c# - 奇怪的tcp连接场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28174914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com