gpt4 book ai didi

c++ - ACE_SOCK_Dgram::open() 和 errno

转载 作者:行者123 更新时间:2023-11-30 04:36:09 35 4
gpt4 key购买 nike

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

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

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

奖金问题 - 什么时候可以使用 ACE_OS::last_error()?

谢谢

最佳答案

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

让我们假设,因为您检查的是“errno”而不是 GetLastError(),所以您正在运行 UNIX 风格的系统,例如 Linux。查看 OS_S_errno.inl,您可以找到描述不同操作系统之间行为差异的注释。

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

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

关于c++ - ACE_SOCK_Dgram::open() 和 errno,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4745150/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com