在UDP套接字上使用write()/ read()?

时间:2014-11-13 13:26:09

标签: c++ c linux sockets udp

根据手册页:

  

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()相同。

另外,如果我没有错(在手册页中找不到),recvflags == 0相当于read(类似于writesend)。


所以:

  • 这是否意味着,在UDP套接字上使用read是完全正常的(如果我不需要src_addr)?
  • 有没有办法在UDP套接字上使用write(现在我在sendto的{​​{1}}参数中设置了目标地址)?

2 个答案:

答案 0 :(得分:5)

  • 如果您不需要源地址,在UDP套接字上使用read()就完全没问了。
  • 如果write() UDP套接字到目的地,则可以使用connect()

答案 1 :(得分:3)

  

另外,如果我没有错(无法在手册页中找到它),:: recv   with flags == 0相当于:: read(模拟到:: write和   ::发送)

是的,如果文件描述符是套接字是正确的:send / recv将因EBADF而失败。
在面向连接的模型中,send等同于sendtorecvrecvfrom且为sockaddr *,因为协议已经提供了它们。

然而,使用UDP,没有连接,所以这样的呼叫:

// assume fd to be an UDP socket
write(fd, buff, bytes) 

没有意义,因为没有提供目的地(EDESTADDRREQ)。 相反,当您读取数据包时,您知道数据包的来源,并且您可能希望使用该IP以防出现错误的情况。

我的建议是:

  • 如果您处于面向连接的模式,请使用send / recv,例如TCP
  • 使用sendto / recvfrom 主要进行无连接通信,例如UDP
  • 如果您不为原始I / O指定任何标记,请使用write / read >

我不会建议处理这两种协议的单个类,而是两个专门的协议;不要混合协议。