簡體   English   中英

如果我想使用 UDP 從服務器接收數據,是否需要 bind()?

[英]Is bind() necessary if I want to receive data from a server using UDP?

如果我想從服務器接收數據,是否需要在客戶端bind

我看過一個模式(看下圖),似乎沒有必要。 但據我所知,綁定是為套接字提供地址所必需的。 如果我不“綁定”套接字,我如何向它發送數據?

UDP客戶端/服務器

bind()調用僅將套接字綁定到端口。 因此,在這種情況下, server需要綁定到端口。

另一方面,客戶端只需要向特定端口(服務器)發送或接收數據; 因此,它只是connect() s,然后執行recvfrom()sendto()

閱讀第 5.3 節的最后一段: http : //beej.us/guide/bgnet/output/html/singlepage/bgnet.html

作為客戶端,應用程序需要知道它需要連接到的服務器端口,而作為服務器,應用程序需要知道它需要監聽的服務器端口。 因此,服務器需要綁定到一個 IP 地址和端口,以便客戶端可以連接到它。

客戶端可以簡單地創建一個套接字並調用connect() 綁定到可用的 IP 地址和臨時端口應隱式發生。 但是,是的,沒有什么可以阻止您將客戶端綁定到特定的 IP 地址和端口。

在 UDP 的情況下,盡管沒有“連接”機制,服務器仍然需要綁定到 IP 地址和端口,以允許客戶端向它們發送數據。

在大多數系統上,如果您使用尚未綁定的 UDP 套接字調用sendto ,它會將其隱式綁定到 INADDR_ANY 和一些當前未使用的端口,因此如果這是您想要的(這是常見情況),則不需要客戶端上的顯式綁定。

在某些系統上,嘗試使用未綁定的 udp 套接字發送會給您一個“套接字未綁定”錯誤,因此如果您想要最大的可移植性,您應該在之前綁定客戶端套接字(到端口 0 的 INADDR_ANY 以選擇任何當前未使用的端口)你嘗試發送。

你要么需要綁定,然后你可以發送到(fd,數據,目的地)+recvfrom(fd),或者你可以只連接套接字並使用send(fd,data)(沒有目的地)和recv(fd)。 連接將使用或多或少的隨機端口號和適合到達給定目標的本地 IP 進行隱式綁定。

暫無
暫無

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

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