Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何检查套接字绑定的IP地址是否仍然存在?_C_Linux_Sockets_Networking - Fatal编程技术网

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()
    
  • 希望
    accept()
    在进程在此系统调用上被阻止时,如果IP地址被删除,则会返回一个错误
但上述设施似乎根本不会对IP地址消失和/或接口状态的变化做出反应

  • 在一些计时器回调中调用
    bind()
    ,定期检查IP地址是否仍然可以绑定,但显然每次都必须创建另一个套接字,因为
    bind()
    -禁止两次绑定套接字,所以这种方法看起来很难看(更不用说将侦听套接字绑定到同一地址的问题:端口)
我没有测试的内容,但看起来有问题的内容:

  • 设置
    SO_BINDTODEVICE
    ,希望在接口关闭/IP地址被删除的情况下,这将改变设备从第一个三元组的行为

  • 调用一些
    ioctl()
    比如
    siocsgrp
    或者
    FIOASYNC
    ,因为它们承诺向进程发送异步事件的信号,而异步事件可能包括IP地址的消失

  • netlink
    始终可以用于直接查看路由表,但这是非常特定于Linux的,我不希望有一种标准方法来检查套接字是否正在侦听任何内容

更清楚地说,我真正想要的是一些类似于
RDMA\u CM\u event\u DEVICE\u removation
的事件,但是使用
AF\u INET
sockets,它会通知我什么时候应该放弃监听socket,因为它不再绑定接口,或者(这将是完美的)所有这样的接口都关闭了。但后一个愿望可能无法实现,因为即使是
bind()
如果具有提供的IP地址的唯一接口关闭,则会顺利完成。

如果您将绑定到某个地址,并且该地址从设备中删除,然后重新添加,您仍然能够接收数据包(同时,
接受
将挂在那里等待)。这可能就是内核不通过这些接口发送事件信号的原因。要可靠地检测IP何时被删除,您应该明确要求操作系统通知您。例如,使用或在Windows上,或在Linux上,等等