C#TCPClient,BeginRead最终导致回调垃圾邮件

C#TCPClient,BeginRead最终导致回调垃圾邮件,c#,tcpclient,C#,Tcpclient,我目前正在使用C#TcpClient/TcpListener类在两端发送和接收数据,但一个奇怪的问题不断出现,这真的开始困扰我: 在调试环境(本地)中,每件事情都可以在几个小时、几天内正常工作。。。然而,在本应使用该软件的实时环境中,在几分钟/小时后,一些客户端随机决定用空包垃圾邮件发送传入流。我从中读取的代码开头如下所示: tcpClient.GetStream().BeginRead(Buffer, 0, Buffer.Length, new AsyncCallback(MessageRec

我目前正在使用C#TcpClient/TcpListener类在两端发送和接收数据,但一个奇怪的问题不断出现,这真的开始困扰我:

在调试环境(本地)中,每件事情都可以在几个小时、几天内正常工作。。。然而,在本应使用该软件的实时环境中,在几分钟/小时后,一些客户端随机决定用空包垃圾邮件发送传入流。我从中读取的代码开头如下所示:

tcpClient.GetStream().BeginRead(Buffer, 0, Buffer.Length, new AsyncCallback(MessageReceivedNew), tcpClient.GetStream());
这对大多数客户机来说在几天内都非常有效,但是有些客户机在正常运行几分钟/小时后,会以每秒数百次的速度随机调用回调“MessageReceivedNew”。在应用程序完全关闭或tcp客户端断开连接之前,即使在防火墙中阻止这些客户端,问题仍然存在。缓冲区始终保持为空(在随机垃圾邮件开始之前工作正常)

我在回调中用来处理消息的代码是

int bytesRead = 0;

try {
    NetworkStream ns = tcpClient.GetStream();
    bytesRead = ns.EndRead(ar);
    IsListening = false;
} catch (Exception ex) {
    if (ex is IOException || ex is ObjectDisposedException) {
        OnNetworkStreamException.Invoke(this);
    } else {
        OnUnexpectedError.Invoke(this, ex);
    }

    if (!IsExpectedToDisconnect) SocketExceptionCloseConnection();
    OnClientDisconnected.Invoke(this, DisconnectType);
    return;
}

...message processing...

Receive();

尽量不要在回调中访问TcpClient。尤其是不要再调用GetStream。相反,在数据对象中传递原始流,如Microsoft示例中所示。这是否会导致您的问题-不确定,但另一种方法是推荐的imolemenring异步通信方法。连接可能由于不活动而关闭。连接中断时的代码必须在第一个连接完全关闭之前尝试建立新连接。我将使用from cmd.exe>NetStat-a在问题发生时获取客户端和服务器上的连接状态。@ThorstenDittmar刚刚更改了这一点,并立即对其进行测试。您建议将NetworkStream对象直接传递回beginhead方法,还是在处理消息后通过GetStream()获取流?@jdweng我实现了一个双向的keepalive,因此我认为这不是由于不活动造成的。这个问题只发生在服务器上,而不是客户端,发送到客户端工作正常,但服务器变得疯狂,这真的很奇怪。你发送了多少数据。某些服务器的限制约为10米到20米。