相关疑难解决方法(0)

套接字选项SO_REUSEADDR和SO_REUSEPORT,它们有何不同?它们在所有主要操作系统中的含义是否相同?

man pages和程序员单证套接字选项SO_REUSEADDR,并SO_REUSEPORT针对不同的操作系统,不同的,往往非常混乱.有些操作系统甚至没有选项SO_REUSEPORT.WEB中充满了关于此主题的矛盾信息,并且通常您可以找到仅对特定操作系统的一个套接字实现的信息,这些信息甚至可能在文本中没有明确提及.

那究竟有什么SO_REUSEADDR不同SO_REUSEPORT呢?

系统是否没有SO_REUSEPORT更多限制?

如果我在不同的操作系统上使用任何一个,那么预期的行为究竟是什么?

unix sockets linux windows portability

630
推荐指数
2
解决办法
24万
查看次数

释放OS X上死进程使用的UDP端口

我在OS X 10.11.6上并尝试运行一个通常8008在启动时侦听UDP端口的程序.

此程序通常还会在其操作期间生成几个辅助子进程,但该端口由父进程绑定.

不幸的是,退出程序时,即使程序(父级+子级)不再存在,有时端口仍保持打开状态.

当发生这种情况时,如果我再次尝试运行该程序,它自然会失败并出现EADDRINUSE错误,在这些情况下无论我尝试什么,我发现的唯一解决方案是重启机器.

我很难相信我不能在没有重启的情况下释放端口.

这是我到目前为止运行的一些诊断(我运行和运行所有这些sudo):

查找使用端口的进程8008lsof:

$ lsof -i -n -P | grep UDP | grep 8008
Run Code Online (Sandbox Code Playgroud)

但令人惊讶的是,没有任何结果.

但是,我有更多运气netstat:

$ netstat -tulnvp udp | grep 8008
udp4  0  0  *.8008    *.*    196724   9216  47205   0
Run Code Online (Sandbox Code Playgroud)

所以,端口确实是绑定的,罪魁祸首是pid 47205,但是:

$ ps aux | grep 47205
Run Code Online (Sandbox Code Playgroud)

不归还任何东西.对于PID 4720647207(最确定的是分配给孩子们的PID)也是如此.我还尝试过grep(程序名称,路径等)的其他变体.

我还寻找任何流程报告47205作为其父级:

$ ps -axo pid,ppid,command | grep 47205
Run Code Online (Sandbox Code Playgroud)

所以孩子们的过程也显然已经死了.

无法做kill任何事情,我尝试了SIGHUP …

sockets macos osx-elcapitan

28
推荐指数
1
解决办法
2622
查看次数

标签 统计

sockets ×2

linux ×1

macos ×1

osx-elcapitan ×1

portability ×1

unix ×1

windows ×1