我有一个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周围徘徊我还没有找到一种可行的方法。
作为一个临时的创可贴,我已将其转移到多线程,所以至少当它死了,服务器仍然可以......只会有永久阻塞的线程来处理。
答案 0 :(得分:0)
连接 待定。这是否意味着以后连接仍有待处理?不。状态功能不能预测未来。
“我足够聪明,可以考虑套接字操作阻止的每种可能方式,并确保不会发生这种情况,因此我可以使用阻塞套接字操作,但仍然可以确保它们永远不会阻塞。”不,你不是。甚至不尝试。它不会起作用。使用非阻塞套接字操作。