小编Phi*_*ipp的帖子

如何检查套接字绑定的IP地址是否仍然是有效机器的地址之一?

一旦我打电话socket()bind()(具有特定的IP地址,而不是INADDR_ANY);listen(),似乎无法确定 IP 地址是否仍然是系统接口之一的有效地址。

我研究过使用什么:

  • getsockopt(SO_ERROR)使用;检查错误
  • epoll()对某些EPOLLERR,EPOLL{,RD}HUP事件使用-ing;
  • 希望accept()当进程在此系统调用上被阻止时,如果 IP 地址被删除,会返回错误;

上述这些似乎都没有检测到 IP 地址消失和/或接口状态的变化。

  • 调用bind()一些定时器回调来定期检查IP地址是否可以绑定,但这需要创建另一个套接字,这是不可行的。

我没有测试这些:

  • 设置SO_BINDTODEVICE的目的是希望在接口出现故障/IP 地址被删除的情况下,这将改变第一个三元组中设施的行为。

  • 调用ioctl()类似SIOCSPGRP或 的FIOASYNC函数,因为它们承诺向进程发出有关异步事件的信号,希望这些事件包括 IP 地址的消失。

  • 用于netlink获取路由表事件,但这是 Linux 特定的。

我希望有一种更便携的方式。

我需要的是一些类似于 的事件RDMA_CM_EVENT_DEVICE_REMOVAL,但是AF_INET当没有与该 IP 地址绑定的接口时,套接字会通知我。即使这样也可能无法实现,因为bind()如果接口关闭,即使完成也不会出现错误。

c sockets linux networking

7
推荐指数
1
解决办法
671
查看次数

Linux内核列表实现会导致UB吗?

先决条件:

  1. 根据C 标准,指针算术会产生无效指针,从而导致未定义的行为。
  2. Linux 源代码似乎符合C 标准,希望与大多数体系结构兼容。
  3. Linux的列表实现包含以下代码(保留格式,可能另一个问题的想法是如何使用Stackoverflow语法设置正确的制表宽度):
#define list_entry(ptr, type, member) \
    container_of(ptr, type, member)

#define list_next_entry(pos, member) \
    list_entry((pos)->member.next, typeof(*(pos)), member)

#define list_first_entry(ptr, type, member) \
    list_entry((ptr)->next, type, member)

#define list_entry_is_head(pos, head, member)               \
    (&pos->member == (head))

#define list_for_each_entry(pos, head, member)              \
    for (pos = list_first_entry(head, typeof(*pos), member);    \
         !list_entry_is_head(pos, head, member);            \
         pos = list_next_entry(pos, member))
Run Code Online (Sandbox Code Playgroud)
  1. 上述列表实现的典型用例是具有 type 的结构struct A,其中包含 type 结构列表的头部struct B

:我们假设offsetof(struct B, entry_in_list) > …

c linked-list list linux-kernel

5
推荐指数
1
解决办法
599
查看次数

标签 统计

c ×2

linked-list ×1

linux ×1

linux-kernel ×1

list ×1

networking ×1

sockets ×1