【问题标题】:winsock select reports an 10022 error (by a reason that is not obvious, need tcp/winsock guru help)winsock select 报告 10022 错误(原因不明显,需要 tcp/winsock guru 帮助)
【发布时间】:2016-10-31 04:26:41
【问题描述】:

给定(简化的代码):

const timeval timeout = {100, 0};
for(;;)
{
    fd_set sockets = {2, {service, controlSocket}};
    const auto result = select(0, &sockets, nullptr, nullptr, &timeout);
    ...
    if (result > 0 && FD_ISSET(service, &sockets))
    {
        auto workerConnection = accept(service, nullptr, nullptr);
        WSARecv(workerConnection, ...);
    }
}

其中service是处于监听状态的socket,controlSocket是service socket上第一个建立的传入连接,用于与manager通信。

仅当任何先前建立的工作程序连接在远程端正常关闭时,才会发生错误 10022。我强调这段代码几乎一直都能正常工作,除了工作应用程序关闭一个连接,但是,我并不声称关闭远程端的连接会影响这种行为。我刚刚注意到,这个错误发生在远程端关闭连接之后,而服务端报告 WAIT_CLOSE 为已建立的连接之一。我再重复一遍,这段代码可以正常工作,在循环的下一个循环出现错误之后,直到另一个套接字关闭,select 完全没有错误。错误数等于已建立的workerConnections数。

不知道这是否重要我在不使用本地主机的同一台 PC 上测试运行管理器、服务和工作程序应用程序的代码,而是提供 PC 的网络名称来建立连接。与worker服务建立连接后,应用只能通过workerConnection异步接收和发送数据。

问题:由于它根本不影响服务功能,而且我没有任何其他 WSA 错误,是否可以忽略此错误并避免发送有关它的垃圾邮件日志,或者我错过了一些重要的事情并且必须解决问题?我怀疑 WSA 中存在某种问题,因为错误仅在非常特定的情况下发生。我对么?

【问题讨论】:

    标签: c++ winsock


    【解决方案1】:

    要么我无法正确阅读 MSDN 文档,要么不清楚,但我的代码中存在重大问题。 MSDN 说:

    注意当发出阻塞 Winsock 调用(例如将 timeout 参数设置为 NULL 的 select)时,Winsock 可能需要等待网络事件才能完成调用。在这种情况下,Winsock 会执行警报等待,该等待可能会被安排在同一线程上的异步过程调用 (APC) 中断。在 APC 内发出另一个阻塞 Winsock 调用,中断同一线程上正在进行的阻塞 Winsock 调用将导致未定义的行为,并且 Winsock 客户端绝不能尝试。

    注意无论套接字上的 SO_LINGER 设置如何,shutdown 函数都不会阻塞。

    在我看来,他们想说什么非常不清楚,但问题是当我用超时阻塞调用调用 select 时,即使 MSDN 声称它没有阻塞,windows 可能会同时执行我在WSARecv。在那个回调中,我做了另一个同步 Winsock 调用 - 关闭,尽管 MSDN 声称它没有阻塞。所以我的原始代码完全符合 MSDN 中指出的导致未定义行为的案例。我最初的问题是在我测试调试配置时提出的,只有一个问题。在我开始测试发布配置后,我发现了更多问题。

    尽管我无法提供对 MSDN 的参考,但我得出以下结论(这比上面提供的 MSDN 说明要清楚得多):

    您不能从回调中调用任何 Winsock 函数,这些函数在重叠操作完成后由 windows 调用,除了那些具有 LPOVERLAPPED 输入参数且此参数不能为 NULL 的 Winsock 函数。另一方面,如果它们不使用 Winsock,您可以调用其他阻塞窗口函数。

    【讨论】:

      猜你喜欢
      • 2013-06-10
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      相关资源
      最近更新 更多