我正在使用C#中的套接字开发客户端服务器应用程序,这肯定是一个多线程应用程序,奇怪的是以下内容:
当远程客户端询问时,连接从一个线程关闭,在这个确切的时刻,写操作会抛出此异常:
实际上我每20分钟写64个字节,但奇怪的是每次连接关闭时抛出上面的异常,这意味着写操作需要很长时间才能完成对操作的扩展总是被连接关闭停止,这是网络堆栈中的一个问题吗?更奇怪的是,这个问题只发生在一个客户端,并且仍然发生了一个多星期,所以它不是暂时的。无法将数据写入传输连接:阻止操作因调用WSACancelblockingcall而中断
有什么建议吗?这是硬件问题吗?这是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
}
答案 0 :(得分:0)
其实我发现了问题:
write
的{{1}}方法阻塞,直到它可以成功地将数据写入底层套接字缓冲区(虽然许多人不同意这一点,但实验证明它是正确的)。当缓冲区变满时,NetwrokStream
方法会阻塞,直到发送一些数据,并且数据有空间写入缓冲区,但是当网络连接速度慢且有问题或者读取数据缓慢读取时缓冲区在很长一段时间内都会被write
方法块填满。