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

根据手册页:

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 (类似于writesend )。


所以:

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

  • 如果你不需要源地址,在UDP套接字上使用read()就可以了。
  • 如果connect() UDP套接字connect()到目标,则可以使用write()

另外,如果我没有错(在手册页中找不到),:: recv与flags == 0相当于:: read(类似于:: write和:: send)

是的,如果文件描述符是一个套接字是正确的: send / recv将失败,否则与EBADF。
而且在面向连接的模型中send也相当于sendtorecv与NULL sockaddr *因为协议已经提供了它们。

但是,对于UDP,没有连接,所以像这样的调用:

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

没有目的地提供(EDESTADDRREQ)没有意义。 相反,当你阅读一个数据包时,你知道它来自哪里,而且你可能想使用这个IP来防止某些东西看起来错误。

我的建议是:

  • 如果您处于面向连接的模式(例如TCP),请使用send / recv
  • 使用sendto / recvfrom 主要用于无连接通信,例如UDP
  • 如果不指定任何标志原始I / O,则使用write / read (上述功能可能被视为更高级的功能)

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