C# 写入套接字时出现异常:无法将数据写入传输连接

C# 写入套接字时出现异常:无法将数据写入传输连接,c#,sockets,tcp,C#,Sockets,Tcp,我正在使用C#中的套接字开发一个客户机-服务器应用程序,它确实是一个多线程应用程序,奇怪的是: 当远程客户端请求时,连接从一个线程关闭,此时写入操作抛出此异常: 无法将数据写入传输连接:对WSACancelblockingcall的调用中断了阻塞操作 实际上,我每20分钟写入64字节,但奇怪的是,每次连接关闭时都会引发上述异常,这意味着写入操作需要很长时间才能完成,直到连接关闭时操作总是停止,这是网络堆栈中的问题吗?,更奇怪的是,这个问题只发生在一个客户身上,而且持续了一个多星期,所以它不是暂时

我正在使用C#中的套接字开发一个客户机-服务器应用程序,它确实是一个多线程应用程序,奇怪的是:

当远程客户端请求时,连接从一个线程关闭,此时写入操作抛出此异常:

无法将数据写入传输连接:对WSACancelblockingcall的调用中断了阻塞操作

实际上,我每20分钟写入64字节,但奇怪的是,每次连接关闭时都会引发上述异常,这意味着写入操作需要很长时间才能完成,直到连接关闭时操作总是停止,这是网络堆栈中的问题吗?,更奇怪的是,这个问题只发生在一个客户身上,而且持续了一个多星期,所以它不是暂时的

有什么建议吗?这是硬件问题吗?这是TCP协议问题吗?有没有人遇到过类似的问题并找到了解决方案

编辑:

用于说明该问题的伪代码:

第一个线程:

while(true)
{
     if (some condition)
             close connection;
}
第二个线程:

while(true)
{
      sleep for 20 minutes
      write(array of 64 bytes) //blocks for a very long period of time
}

事实上,我发现了问题:


NetwrokStream
write
方法会一直阻塞,直到它能够成功地将数据写入底层套接字缓冲区为止(尽管许多人不同意这一点,但实验证明它是正确的)。当缓冲区满时,
write
方法将阻塞,直到发送一些数据,并且有空间将数据写入缓冲区,但是,当网络连接速度慢且出现问题时,或者当读卡器读取数据速度慢时,缓冲区会满,写入方法会阻塞很长一段时间。

事实上,我发现了问题:


NetwrokStream
write
方法会一直阻塞,直到它能够成功地将数据写入底层套接字缓冲区为止(尽管许多人不同意这一点,但实验证明它是正确的)。当缓冲区满时,
write
方法将阻塞,直到发送一些数据,并且有空间将数据写入缓冲区,但是,当网络连接缓慢且出现问题时,或者当读卡器缓慢读取数据时,缓冲区会满,并且
write
方法会阻塞很长一段时间。

我的问题是“write”而不是“read”,请更准确地检查问题,请再次阅读:“如果调用.Close()在您的任何一个读卡器或写卡器上创建一个底层流。然后尝试使用该读卡器或写卡器,则会出现此错误。“您是否也在第一个线程和第二个线程之间同步套接字?”?并确保在读/写过程中,您的套接字仍然打开而未关闭?我正在同步线程以确保,在写入之前,我正在检查套接字是否仍然连接。我的问题是“写入”而不是“读取”,请更准确地检查问题,请再次阅读:“如果您调用.Close()在您的任何一个读卡器或写卡器上创建一个底层流。然后尝试使用该读卡器或写卡器,则会出现此错误。“您是否也在第一个线程和第二个线程之间同步套接字?”?并确保在读/写过程中,您的套接字仍处于打开状态,而不是关闭状态?我正在确保线程同步,此外,在写入之前,我正在检查套接字是否仍处于连接状态