即使存在挂起连接,TCPServer AcceptSocket()也会挂起

时间:2015-07-20 17:10:57

标签: c# sockets tcp tcplistener

我有一个TCPServer正在运行文件接收,并且它可以99%的时间工作,但有时(似乎随机)挂在AcceptSocket()行,即使我等待{ {1}}标志为真。这是我用于服务器的代码。 (我知道Pending()是可以的,但这不是手头的问题......我不认为。)

Thread.Sleep()

基本上,因为此代码 工作。即使它有挂起的连接,会导致// wait for the file connection int elapsed = 0; bool timeout = false; int overtime = 60000; while (fileServer.Pending() == false && (elapsed < overtime)) { Thread.Sleep(1000); elapsed += 1000; if (elapsed > overtime) timeout = true; } if (timeout) { Program.EventMessage("FILE SERVER TIMEOUT, NO FILE RECIEVED"); incoming_file = false; continue; } Program.EventMessage("OPENING SOCKET"); fileSocketForClient = fileServer.AcceptSocket(); 挂起的问题是什么?

无论如何都要检查Socket Accepting是否阻止我可以实现超时?

我希望套接字保持阻塞状态,因为应用程序的其余部分确实需要完成此操作才能继续前进,它只需要一个超时或其他东西,如果它确实废弃,可以在不必手动恢复的情况下恢复重启整个程序。

发现了问题,我知道我需要做些什么来修复它(超时AcceptSocket()),但是在SO周围徘徊我还没有找到一种可行的方法。

作为一个临时的创可贴,我已将其转移到多线程,所以至少当它死了,服务器仍然可以......只会有永久阻塞的线程来处理。

1 个答案:

答案 0 :(得分:0)

连接 待定。这是否意味着以后连接仍有待处理?不。状态功能不能预测未来。

“我足够聪明,可以考虑套接字操作阻止的每种可能方式,并确保不会发生这种情况,因此我可以使用阻塞套接字操作,但仍然可以确保它们永远不会阻塞。”不,你不是。甚至不尝试。它不会起作用。使用非阻塞套接字操作。