【问题标题】:TCPServer AcceptSocket() hangs even though there is a pending connection即使有挂起的连接,TCPServer AcceptSocket() 也会挂起
【发布时间】: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


【解决方案1】:

一个连接正在挂起。这是否意味着稍后连接仍将处于挂起状态?不。状态函数不能预测未来。

“我足够聪明,可以想到所有可能的套接字操作可能会阻塞的方式,并确保不会发生这种情况,因此我可以使用阻塞套接字操作并且仍然可以确保它们永远不会阻塞。”不,你不是。甚至不要尝试。它行不通。使用非阻塞套接字操作。

【讨论】:

  • 我很感谢投反对票者的解释。如果我不清楚,我想知道需要澄清什么。如果我不正确,我想知道如何。
  • 大卫,只要建议使用线程,你就会从孩子那里得到大量的代表。
  • 虽然它确实可以洞察可能发生的事情,但这并不能回答我的问题。
  • 答案是使用非阻塞套接字操作,正如我所说。阻塞套接字操作几乎是不可能的。
猜你喜欢
  • 1970-01-01
  • 2014-05-02
  • 2021-05-02
  • 2018-05-12
  • 2013-01-09
  • 1970-01-01
  • 2013-08-13
  • 2018-03-18
  • 1970-01-01
相关资源
最近更新 更多