我正在發送一些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中的疏忽?