根据手册页:
send()和write(2)之间的唯一区别是标志的存在 . 使用零标志参数,send()等效于write(2) . 另外,以下调用send(sockfd,buf,len,flags);相当于sendto(sockfd,buf,len,flags,NULL,0);
和
recv()调用通常仅用于连接的套接字(请参阅connect(2)),并且与带有NULL src_addr参数的recvfrom()相同 .
另外,如果我在手册页中找到它, recv
与 flags == 0
相当于 read
(类似于 write
和 send
) .
所以:
-
这是不是意味着,在UDP套接字上使用
read
完全没问题(如果我不需要src_addr
)? -
有没有办法在UDP套接字上使用
write
(现在我在sendto
的dest_addr
参数中设置了目标地址)?
2 回答
如果您不需要源地址,在UDP套接字上使用
read()
是完全正常的 .如果您将UDP套接字
connect()
到目的地,则可以使用write()
.是的,如果文件描述符是套接字是正确的:
send
/recv
否则将失败,否则EBADF .并且在面向连接的模型中
send
等同于sendto
和recv
到recvfrom
与NULLsockaddr *
也是如此,因为协议已经提供了它们 .但是,使用UDP,没有连接所以这样的调用:
因为没有提供目的地(EDESTADDRREQ),所以没有意义 . 相反,当您读取数据包时,您知道它的来源,并且您可能希望在出现错误的情况下使用该IP,以获得信息 .
我的建议是:
如果您处于面向连接的模式,请使用
send
/recv
,例如TCP使用
sendto
/recvfrom
主要用于无连接通信,例如UDP如果您不为原始I / O指定任何标志 and ,请使用
write
/read
(上述功能可视为更高级别的功能)我不会建议一个处理这两个协议的类,而是两个专门的协议;不要混合协议 .