C `sendto` 与 `write`

C `sendto` versus `write`

如果我错了请纠正我,但我对发送原始数据包的理解不可避免地定义为缓冲数组中的字节数组,并将其写入套接字。但是,到目前为止,我看到的大多数示例代码都倾向于 sendto,很少使用 send,而且除了我自己使用 write 之外,我从未见过其他代码。我错过了什么吗?这种明显的专注于像这样复杂的代码是怎么回事?

write 在我看来是处理原始套接字时的明显选择时,为什么要使用 sendsendto

sendto 通常用于未连接的 UDP 套接字或原始套接字。它采用指定数据包目的地 address/port 的参数。 sendwrite 没有这个参数,所以没有办法告诉数据去哪里。

send 用于 TCP 套接字和已连接的 UDP 套接字。由于已经建立了连接,所以不需要指定目的地,事实上这个函数没有一个参数。

虽然 write 函数可以用在 send 可以使用的地方,但它缺少可以在 TCP 套接字上启用某些行为的 flags 参数。它也没有 return 与 send 相同的一组错误代码,因此如果出现问题,您可能无法获得有意义的错误代码。理论上,如果设置了 IP_HDRINCL 套接字选项,您也可以在原始套接字上使用 write,但同样不可取,因为它不支持与 send 相同的错误代码。