【问题标题】:ACE_SOCK_Dgram::open() and errnoACE_SOCK_Dgram::open() 和 errno
【发布时间】:2011-06-12 07:44:33
【问题描述】:

我试图打开已经打开的 UDP 端口并且 ACE_SOCK_Dgram::open() 失败。 正如预期的那样,strace 显示 bind() 失败并且 errno 设置为 EADDRINUSE。

为了查看发生了什么错误,我使用了 ACE_OS::last_error(),但它没有更新。

我想向用户提供端口已在使用中的信息性错误,而不是一些一般性错误。

额外问题 - 何时可以使用 ACE_OS::last_error()?

Tnx

【问题讨论】:

  • @baris_a 你有答案吗?我会接受的:)

标签: c++ networking ace


【解决方案1】:

如果您提供更多详细信息会有所帮助。您在哪个平台上运行您的应用程序?您使用的是什么版本的 ACE 库?它是 1-1024 范围内的 UDP 端口吗?你使用广播UDP套接字吗?

假设由于您检查的是“errno”而不是 GetLastError(),因此您在 UNIX 风格(如 Linux)上运行。查看 OS_S_errno.inl,您可以找到描述不同操作系统之间行为差异的 cmets。

您不是在问为什么首先获得 EADDRINUSE for UDP 套接字。你使用 SO_REUSEADDR 选项吗?如果你这样做了,你应该知道只有最后一个绑定到套接字的进程会被通知,并且行为可能会因操作系统而异。

是否有可能在 bind() 之后发出另一个系统函数调用?在这种情况下,bind() 返回的错误可能会被随后的系统调用重置。从 last_error() 的实现中可以看出,它只是在 Windows 上设置“errno = ::GetLastError()”,并在 UNIX 上直接返回 errno。

【讨论】:

    【解决方案2】:

    我发现了问题。我使用 ACE_OS::last_error() 来宏(是的,宏不好),它扩展到了几个链接。其中一行执行了系统调用,因此 errno 的值发生了变化

    【讨论】:

      【解决方案3】:

      你有没有试过在打开电话后自己检查errno?在我看来,如果 errno == EADDRINUSE 您可以从那里随心所欲地处理它,而无需 ACE 的帮助。

      【讨论】:

        猜你喜欢
        • 2014-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-25
        • 1970-01-01
        相关资源
        最近更新 更多