簡體   English   中英

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

[英]Using write()/read() on UDP socket?

根據手冊頁:

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

另外,如果我沒有弄錯(在手冊頁中找不到它),帶有flags == 0 recv等效於read (類似於writesend )。


所以:

  • 這是否意味着,在 UDP 套接字上使用read完全沒問題(如果我不需要src_addr )?
  • 有沒有辦法在 UDP 套接字上使用write (因為現在我在sendtodest_addr參數中設置了目標地址)?
  • 如果您不需要源地址,則在 UDP 套接字上使用read()完全沒問題。
  • 如果您connect() UDP 套接字connect()到目標,則可以使用write()

另外,如果我沒有錯(在手冊頁中找不到),帶有標志 == 0 的 ::recv 等效於 ::read(類似於 ::write 和 ::send)

是的,如果文件描述符是套接字是正確的: send / recv將失敗,否則 EBADF。
並且在面向連接的模型中, send等同於sendtorecv to recvfrom with 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 (上述功能可能被視為更高級別的功能)

我不建議使用一個類來處理兩種協議,而是建議使用兩個專門的類; 不要混合協議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM