Linux下使用两个ICMP原始套接字分线程收发是否安全?
双原始套接字分线程处理ICMP收发是否安全?
这种实现是安全的,但有几个关键细节需要注意:
套接字独立性:每次调用
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)都会生成独立的文件描述符,内核会分别维护每个套接字的发送/接收队列。两个线程各自操作自己的套接字,不存在共享资源的竞争冲突,线程安全层面没有问题。接收报文的重复问题:默认情况下,系统中所有匹配IPPROTO_ICMP的报文会被所有处于活跃状态的ICMP原始套接字接收。这意味着你的接收线程会收到所有ICMP包(包括其他进程产生的、甚至本机发出的ICMP请求),而且两个套接字都会收到同一份回复报文。你需要在接收逻辑里通过ICMP包的ID、序列号等字段,过滤出属于自己的ping回复。
权限要求:创建原始套接字需要root权限,运行程序时记得用
sudo或者以root用户执行,否则会创建失败。
额外提一句:其实没必要创建两个套接字——单个原始套接字的sendto()和recvfrom()都是线程安全的系统调用,内核会保证这些操作的原子性。如果只是为了拆分收发逻辑到不同线程,直接用同一个套接字在两个线程分别调用收发接口也完全可行,还能避免重复接收的问题。
内容的提问来源于stack exchange,提问作者MaPo
相关产品推荐
相关产品推荐

