写入套接字时出现异常:无法将数据写入传输连接
本文关键字:传输 连接 数据 异常 套接字 | 更新日期: 2023-09-27 17:59:15
我正在使用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
方法会阻塞,直到发送了一些数据,并且有空间将数据写入缓冲区,但当网络连接缓慢且出现问题时,或者当读取器读取数据缓慢时,缓冲区会满,write
方法会阻塞很长一段时间。