[英]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
(類似於write
和send
)。
所以:
read
完全沒問題(如果我不需要src_addr
)?write
(因為現在我在sendto
的dest_addr
參數中設置了目標地址)?read()
完全沒問題。connect()
UDP 套接字connect()
到目標,則可以使用write()
。另外,如果我沒有錯(在手冊頁中找不到),帶有標志 == 0 的 ::recv 等效於 ::read(類似於 ::write 和 ::send)
是的,如果文件描述符是套接字是正確的: send
/ recv
將失敗,否則 EBADF。
並且在面向連接的模型中, send
等同於sendto
和recv
to recvfrom
with NULL sockaddr *
也是正確的,因為協議已經提供了它們。
但是,使用 UDP 時,沒有連接,因此調用如下:
// assume fd to be an UDP socket
write(fd, buff, bytes)
因為沒有提供目的地(EDESTADDRREQ),所以沒有意義。 相反,當您讀取數據包時,您知道它來自哪里,並且您可能希望使用該 IP 以防萬一出現問題,例如。
我的建議是:
send
/ recv
sendto
/ recvfrom
主要用於無連接通信,例如 UDPwrite
/ read
(上述功能可能被視為更高級別的功能)我不建議使用一個類來處理兩種協議,而是建議使用兩個專門的類; 不要混合協議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.