c - 如何检查socket绑定的IP地址是否还存在?
问题描述
我的问题是,一旦我打电话socket()
;bind()
(有一些特定的 IP 地址,不是INADDR_ANY
);listen()
,似乎无法确定我绑定套接字的IP地址是否仍然存在于系统中。
我研究使用的内容:
getsockopt(SO_ERROR)
用;检查错误epoll()
-参加一些活动EPOLLERR
;EPOLL{,RD}HUP
- 希望
accept()
如果在此系统调用上阻止进程时删除 IP 地址,则会返回错误;
但是上面的设施似乎根本没有对 IP 地址消失和/或接口状态的变化做出反应。
- 调用
bind()
一些计时器回调以定期检查 IP 地址是否仍然可以绑定,但显然每次都必须创建另一个套接字,因为bind()
禁止 -ing 套接字两次,所以这种方法对我来说看起来很丑(更不用说与绑定相关的问题监听套接字到相同的地址:端口)。
我没有测试,但看起来有问题:
设置
SO_BINDTODEVICE
希望这将改变第一个三元组的设施行为,以防接口出现故障/IP地址被删除打电话给一些
ioctl()
喜欢的SIOCSPGRP
人,或者FIOASYNC
因为他们承诺向进程发出关于异步事件的信号,这些事件可能包括IP地址的消失
还
netlink
总是可以用来直接查看路由表,但这是非常特定于 Linux 的,我不希望有一个标准的方法来检查你的套接字是否真的在监听任何东西
为了更清楚,我真正想要的是一些类似于 的事件 RDMA_CM_EVENT_DEVICE_REMOVAL
,但使用AF_INET
套接字,当我应该放弃监听套接字时会通知我,因为它不再绑定到接口,或者(这将是完美的)所有此类接口都已关闭。但很可能后一个愿望是不可能实现的,因为bind()
如果提供IP地址的唯一接口关闭,即使是顺利完成。
解决方案
推荐阅读
- python - PyTorch - 被覆盖的变量是否留在图中?
- erlang - mnesia 表的大小(以 MB 为单位)
- ubuntu - 如何从特定目录中选择日志并在 Kibana 上显示
- java - Parcelable 对象通过通知接收到 null 但在活动之间工作
- android - 在 Activity 类中实现 Google Sign In
- assembly - 组装:什么系统返回?
- c# - 在选择新的实体框架 ASP.net 中使用定义到另一个对象的对象
- angular - 角度材料 - 手动输入错误地转换日期
- pdf - Portlet 应用程序/pdf 不是受支持的 mime 类型错误
- c++ - 如何在 MISRA C++ 之后实现 CRTP