如果我错了,请纠正我,但我对发送原始数据包的理解不可避免地被定义为缓冲数组中的字节数组,并将其写入套接字。但是,到目前为止,我看到的大多数示例代码都倾向于sendto
,很少使用send
,而且我从未见过除了我自己使用write
以外的代码。我错过了什么吗?这种明显的关注是什么使这样的代码变得复杂?
为什么在处理原始套接字时,send
似乎是我sendto
和write
的明显选择?
答案 0 :(得分:7)
sendto
通常与未连接的UDP套接字或原始套接字一起使用。它需要一个参数来指定数据包的目标地址/端口。 send
和write
没有此参数,因此无法告知数据去哪里。
send
与TCP套接字和连接的UDP套接字一起使用。由于已建立连接,因此不需要指定目标,实际上此函数没有一个参数。
虽然可以在可以使用write
的地方使用send
函数,但它缺少可以在TCP套接字上启用某些行为的flags
参数。它也不会返回与send
相同的错误代码集,因此如果出现问题,您可能无法获得有意义的错误代码。理论上,如果设置了write
套接字选项,您还可以在原始套接字上使用IP_HDRINCL
,但同样不是优选的,因为它不支持与send
相同的错误代码。 / p>