C 如何检查套接字绑定的IP地址是否仍然存在?
我的问题是,一旦调用C 如何检查套接字绑定的IP地址是否仍然存在?,c,linux,sockets,networking,C,Linux,Sockets,Networking,我的问题是,一旦调用socket()bind()(使用特定的IP地址,而不是INADDR\u ANY)listen(),似乎无法确定我绑定套接字的IP地址是否仍然存在于系统中 我使用的是: 使用getsockopt检查错误(SO_错误) epoll() 希望accept()在进程在此系统调用上被阻止时,如果IP地址被删除,则会返回一个错误 但上述设施似乎根本不会对IP地址消失和/或接口状态的变化做出反应 在一些计时器回调中调用bind(),定期检查IP地址是否仍然可以绑定,但显然每次都必须
socket()
bind()
(使用特定的IP地址,而不是INADDR\u ANY
)listen()
,似乎无法确定我绑定套接字的IP地址是否仍然存在于系统中
我使用的是:
- 使用getsockopt检查错误(SO_错误)李>
epoll()李>
- 希望
在进程在此系统调用上被阻止时,如果IP地址被删除,则会返回一个错误李>accept()
- 希望
- 在一些计时器回调中调用
,定期检查IP地址是否仍然可以绑定,但显然每次都必须创建另一个套接字,因为bind()
-禁止两次绑定套接字,所以这种方法看起来很难看(更不用说将侦听套接字绑定到同一地址的问题:端口)bind()
- 设置
,希望在接口关闭/IP地址被删除的情况下,这将改变设备从第一个三元组的行为SO_BINDTODEVICE
- 调用一些
比如ioctl()
或者siocsgrp
,因为它们承诺向进程发送异步事件的信号,而异步事件可能包括IP地址的消失FIOASYNC
始终可以用于直接查看路由表,但这是非常特定于Linux的,我不希望有一种标准方法来检查套接字是否正在侦听任何内容netlink
更清楚地说,我真正想要的是一些类似于
RDMA\u CM\u event\u DEVICE\u removation
的事件,但是使用AF\u INET
sockets,它会通知我什么时候应该放弃监听socket,因为它不再绑定接口,或者(这将是完美的)所有这样的接口都关闭了。但后一个愿望可能无法实现,因为即使是bind()
如果具有提供的IP地址的唯一接口关闭,则会顺利完成。如果您将绑定到某个地址,并且该地址从设备中删除,然后重新添加,您仍然能够接收数据包(同时,接受
将挂在那里等待)。这可能就是内核不通过这些接口发送事件信号的原因。要可靠地检测IP何时被删除,您应该明确要求操作系统通知您。例如,使用或在Windows上,或在Linux上,等等