根据手册页:
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
)。
所以:
read
是完全正常的(如果我不需要src_addr
)?write
(现在我在sendto
的{{1}}参数中设置了目标地址)?答案 0 :(得分:5)
read()
就完全没问了。write()
UDP套接字到目的地,则可以使用connect()
。答案 1 :(得分:3)
另外,如果我没有错(无法在手册页中找到它),:: recv with flags == 0相当于:: read(模拟到:: write和 ::发送)
是的,如果文件描述符是套接字是正确的:send
/ recv
将因EBADF而失败。
在面向连接的模型中,send
等同于sendto
和recv
到recvfrom
且为sockaddr *
,因为协议已经提供了它们。
然而,使用UDP,没有连接,所以这样的呼叫:
// assume fd to be an UDP socket
write(fd, buff, bytes)
没有意义,因为没有提供目的地(EDESTADDRREQ)。 相反,当您读取数据包时,您知道数据包的来源,并且您可能希望使用该IP以防出现错误的情况。
我的建议是:
send
/ recv
,例如TCP sendto
/ recvfrom
主要进行无连接通信,例如UDP write
/ read
我不会建议处理这两种协议的单个类,而是两个专门的协议;不要混合协议。