【发布时间】:2015-07-25 03:42:09
【问题描述】:
我有一个 TCPServer 正在运行以接收文件,它在 99% 的时间都可以工作,但有时(似乎随机)会挂在 AcceptSocket() 行上,即使我等待 Pending() 标志是真的。这是我用于服务器的代码。 (我知道Thread.Sleep() 是bleh,但这不是手头的问题......我不认为)。
// 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();
基本上,因为这段代码确实有效。什么会导致AcceptSocket() 挂起的问题,即使它有一个挂起的连接?
有没有办法检查 Socket Accepting 是否阻塞我可以实现超时?
我希望套接字保持阻塞状态,因为应用程序的其余部分确实需要完成此操作才能继续前进,它只需要超时或其他东西,因此如果它确实出现问题,可以恢复而无需手动重新启动整个程序。
发现了问题,我知道我需要做些什么来解决它(超时AcceptSocket()),但是四处寻找,所以我还没有找到可行的方法。
作为临时创可贴,我已将其移至多线程,因此至少当它死机时,服务器仍然可以运行……只有永远阻塞的线程要处理。
【问题讨论】:
-
Pending电话不能预测未来。连接在过去挂起并不能保证该连接以后仍将处于挂起状态。如果您想要不阻塞的套接字操作,请使用不阻塞的套接字操作。 -
但待定呼叫确定它是否有传入连接。没有?
-
在它返回时,是的。但这并不能预测未来。连接可能稍后不会挂起,比如因为对方关闭了它。如果您想要非阻塞套接字操作,请使用非阻塞套接字操作。
-
您真正的问题是“如何使 AcceptSocket 超时?”。由于睡眠,您的代码目前处于阻塞状态,因此非阻塞不是您的目标。
-
这几乎就是我想要实现的目标,是的。
标签: c# sockets tcp tcplistener