首页 文章

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

提问于
浏览
6

根据手册页:

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 (现在我在 sendtodest_addr 参数中设置了目标地址)?

2 回答

  • 5
    • 如果您不需要源地址,在UDP套接字上使用 read() 是完全正常的 .

    • 如果您将UDP套接字 connect() 到目的地,则可以使用 write() .

  • 3

    另外,如果我没有错(在手册页中找不到它),:: recv with flags == 0相当于:: read(analogue to :: write and :: send)

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

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

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

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

    我的建议是:

    • 如果您处于面向连接的模式,请使用 send / recv ,例如TCP

    • 使用 sendto / recvfrom 主要用于无连接通信,例如UDP

    • 如果您不为原始I / O指定任何标志 and ,请使用 write / read (上述功能可视为更高级别的功能)

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

相关问题