gpt4 book ai didi

c - 绑定(bind)套接字时如何不破坏 UDP 端口?

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:19 26 4
gpt4 key购买 nike

我正在使用 GCDAsyncUdpSocket打开一个 UDP 套接字,然后我将它绑定(bind)到一个端口。该类只是对常用 POSIX 套接字调用(如 socketbind 等)的包装。

场景 1:

  • MyMacBook:启动进程A
  • MyMacBook:打开 UDP 端口 23141 => 成功
  • SomeComputer:发送一个 UDP 数据包到 MyMacBook,端口 23141
  • MyMacBook:标准 OSX 防火墙询问我是否允许传入网络连接,我同意。
  • MyMacBook:忽略数据包,不要阅读它。 (或者至少,我没有看到一条日志消息告诉我我收到了一个数据包。我的代码被破坏了,或者 CocoaAsyncSocket 代码被破坏了,或者操作系统没有向我的程序报告数据包。)
  • MyMacBook:杀死进程 A
  • MyMacBook:启动进程A
  • MyMacBook:打开 UDP 端口 23141 => 失败:Error Domain=NSPOSIXErrorDomain Code=48 "Address already in use"UserInfo=0x100407f30 {NSLocalizedDescription=Address already in use, NSLocalizedFailureReason=Error in bind() function

为什么???

netstat -n |grep 2314
udp4 626 0 *.23146 *.*
udp4 1251 0 *.23141 *.*

^^这是损坏的 UDP 端口在 shell 上的样子。如果我想再次使用那个端口号,我似乎必须重新启动我的机器:-(

不,我没有卡在周围的旧进程阻塞端口。我检查了 ps auxlsof -i | grep UDP.

场景 2:

  • MyMacBook:启动进程A
  • MyMacBook:打开 UDP 端口 23143 => 成功
  • MyMacBook:杀死进程 A
  • MyMacBook:启动进程A
  • MyMacBook:打开 UDP 端口 23143 => 成功
  • MyMacBook:杀死进程 A
  • MyMacBook:启动进程A
  • MyMacBook:打开 UDP 端口 23143 => 成功
  • MyMacBook:杀死进程 A
  • ...

如果端口从未被使用过,系统不会关心我是否关闭它。这是应该的。

我的问题:

这里有什么问题?当然,在一个完美的世界中,程序不会崩溃,套接字都用 POSIX close 函数关闭。在一个不完美的世界中,我只是键入 Cmd-。在 XCode 中终止我正在开发的应用程序,并且未调用 close

当我试图将我的套接字绑定(bind)到 UDP 端口时,我真正想对操作系统说的是:“请 OSX 10.8.5,将我的套接字绑定(bind)到端口 23141。如果其他程序打开了它currently and is listening,那么你可以告诉我这个端口正在使用中,但是如果没有正在运行的程序关心这个端口,那么让我把它绑定(bind)到端口 23141!!”这是 OSX 错误吗?这是新的吗?它是记录在案的已知错误,还是所谓的“功能”?

最佳答案

这似乎是 OSX 中的一个错误。

相关文章:
https://superuser.com/questions/504750/kill-udp-port-that-has-no-process
https://apple.stackexchange.com/questions/71300/how-can-i-unbind-a-udp-port-that-has-no-entry-in-lsof
(@Barmar:感谢您找到这些文章)

1) 我注意到,如果 UDP 端口损坏(它已绑定(bind),但未绑定(bind)到特定进程),则必须重新启动计算机才能再次使用该端口。注销并再次登录不起作用。

2) 我发现,如果您禁用 OSX 防火墙 就没有问题。这意味着问题是标准 OSX 防火墙中的错误。但是,如果禁用防火墙,损坏的端口不会恢复正常,您仍然需要重新启动计算机才能恢复正常。但是:如果防火墙关闭,则不会损坏任何端口。

我们可以从第 2 部分中学到一些东西:OSX 防火墙不是一个简单的数据包过滤器。它似乎在内核级别破解了套接字命令。

也许有人想要编写错误报告并将其发送给 Apple...(听起来像个笑话,不是吗?)

关于c - 绑定(bind)套接字时如何不破坏 UDP 端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20956836/

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