如何通过原始套接字修改 IP 数据包头

背景:我们的设备上有个链路探测的功能,会定时请求公网的某个 IP 地址,以探测网络是不是连通的。具体的做法是会使用 icmp 或 dns 探测远端服务器,看请求能否正常响应,如果有响应,则认为链路正常,否则则认为不正常,需要采取对应的措施。但是问题的现象是每隔一段时间后,探测包就收不到回复了,导致我们认为线路异 ... 阅读更多

服务端的 socket 如何知道客户端是通过什么 IP 地址连接过来的

问题场景:服务器有多个网卡,分别绑定了地址 A 、地址 B 和地址 C,当客户端连接请求过来的时候,如何知道是从哪个 IP 地址请求过来的? 解决方案:服务端 accept 客户端的连接后,对这个新接受的 socket 进行 getsockname 就可以了。 示例代码: [crayon-6948d5085e5ed55024 ... 阅读更多

给 socket 分配随机端口

客户端的 socket 不需要手动执行 bind 绑定地址,但这不意味着客户端 socket 真的不需要绑定端口,实际上是内核它帮我们做了这个操作,在执行 connect 时,内核发现没有绑定端口,就会自动选择一个合适的端口绑定到 socket 。 当然这不说明我们不能对客户端 socket 执行 bind 操作,对于客户端 s ... 阅读更多

I/O 模型

一、 I/O 模型分类 unix 环境下有 5 中 IO 模型: 阻塞式 I/O 非阻塞式 I/O I/O 多路复用 信号驱动 I/O 异步 I/O(POSIX 中的 aio_系列函数) 常用的是前三种方式,特别是多路 I/O 复用是目前使用最广泛的 I/O 模型。它不仅包含了阻塞和非阻塞,同时也包含了异步调用。非阻塞+异步是效率最高 ... 阅读更多

epoll 中的边缘触发 ET 和水平触发 LT 模式

epoll 中的触发模式有两种,边缘触发和水平触发,默认情况下使用的是水平触发。 边缘触发 (ET) 的意思是当电平出现变化的时候才触发事件,如果设置了边缘触发,执行 epoll_wait 时,内核检测到数据到达后立马返回到应用层。但是这仅仅只返回这一次,如果缓冲区中的数据没有读取完,再次执行 epoll_wa ... 阅读更多