我正在发送一些ping数据包,通过我的linux机器上的一个原始套接字。C原始套接字发送地址的目的是什么?
int sock_fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
这意味着,我指定的IP数据包报头时,我写入套接字(IP_HDRINCL
被隐含)。
写入与send
插座失败,告诉我我需要指定一个地址。
如果我使用sendto
那么它工作。对于sendto
我必须指定一个sockaddr_in
结构使用,其中包括字段sin_family
,sin_port
和sin_addr
。
不过,我已经注意到了几件事:
- 的
sin_family
是AF_INET
- 创建插座时已经指定。 sin_port
自然未被使用(端口不是IP的概念)。- 只要它是外部地址(IP数据包指定为8.8.8.8,
sin_addr
指定为1.1.1.1),我使用哪个地址并不重要。
看来sendto
的额外字段实际上在很大程度上没有任何用处。那么,是否有一个技术原因,我必须使用sendto
而不是send
,还是仅仅是API中的疏忽?