根据手册页:
send()和write(2)之间唯一的区别是标志的存在。 使用零标志参数,send()等价于write(2)。 另外,下面的调用发送(sockfd,buf,len,flags); 相当于sendto(sockfd,buf,len,flags,NULL,0);
和
recv()调用通常只用于连接的套接字(请参阅connect(2)),与recvfrom()使用NULL src_addr参数相同。
另外,如果我没有错(在手册页中找不到),使用flags == 0
recv
相当于read
(类似于write
和send
)。
所以:
read
UDP套接字是完全正常的(如果我不需要src_addr
)? write
在UDP套接字(因为现在我设置目标地址在sendto
的dest_addr
参数)? read()
就可以了。 connect()
UDP套接字connect()
到目标,则可以使用write()
。 另外,如果我没有错(在手册页中找不到),:: recv与flags == 0相当于:: read(类似于:: write和:: send)
是的,如果文件描述符是一个套接字是正确的: send
/ recv
将失败,否则与EBADF。
而且在面向连接的模型中send
也相当于sendto
和recv
与NULL sockaddr *
因为协议已经提供了它们。
但是,对于UDP,没有连接,所以像这样的调用:
// assume fd to be an UDP socket write(fd, buff, bytes)
没有目的地提供(EDESTADDRREQ)没有意义。 相反,当你阅读一个数据包时,你知道它来自哪里,而且你可能想使用这个IP来防止某些东西看起来错误。
我的建议是:
send
/ recv
sendto
/ recvfrom
主要用于无连接通信,例如UDP write
/ read
(上述功能可能被视为更高级的功能) 我不会建议处理两个协议的单个类,而是两个专门的类。 不要混合协议。