2010-06-03 102 views
4

我的初始UDP套接字綁定到127.0.0.1:9898。如何綁定/連接多個UDP套接字

第一次通過epoll/kqueue得到傳入數據的通知時,我執行recvfrom()並填充名爲peer_name的包含對等信息(ip:port)的struct sockaddr。

然後,我創建使用套接字()的新UPD插座,

然後我綁定()這個新創建的套接字連接到同一個IP:比我原來的插座端口(127.0.0.1:9898)。

然後我使用connect()將剛剛創建的套接字連接到剛剛發送給我的對象。我在struct sockaddr中獲得了名爲peer_name的信息。

然後我在我的epoll/kqueue向量中添加我新創建的套接字並等待通知。

我希望只接收來自對端的UDP幀「」連接到「」。

1 /確實netstat -a -p udp是假設向我顯示IP:我的新創建的套接字的端口是「」連接到「」?

2 /我可能做錯了,因爲在創建我的新套接字後,此套接字接收所有到達IP綁定的IP:PORT端口的所有傳入UDP數據包,而不考慮源對等IP:PORT。

我想看看我正在努力做的一個工作示例:) 或任何暗示我做錯了什麼。

謝謝!

回答

1

(2)連接在一個UDP套接字只是設置套接字的默認目標地址(數據會如果使用寫入發送(2)發送(2)插槽上) 。它沒有其他的影響 - 你仍然可以發送數據包到其他地址sendto(2)sendmsg(2),你仍然會看到從任何地址發送的數據包。

因此,在端口上打開一個新套接字沒有任何意義 - 對於接收到的每個數據包,您需要查看源地址以查看它是否來自您已經看到的地址(因此屬於該邏輯流)或者是新地址(新邏輯流)。

+0

可以肯定的是,我在談論服務器端。這個想法是,新的套接字將接收來自特定客戶端的所有數據。所以這就是爲什麼我連接()我的新套接字到源客戶端IP:PORT。 套接字作爲sockname和對等名稱。sockname是套接字綁定到的ADDR:PORT,而peername是套接字關聯的ADDR:PORT(使用connect()),因此send()知道發送數據的人。 getsockname(),getpeername()。 – nicboul 2010-06-03 18:02:03

+0

@nicboul:是的。 Chris指出的是,UDP套接字上的connect()通常只在* client端有用,其中一個套接字只與一個對等端進行通信。它在服務器端無用。 – caf 2010-06-04 02:21:10

+1

@克里斯我不會挑剔,但我不確定我是否同意你的發言。我認爲連接具有remote-addr綁定的效果,因此您可以將該套接字上的流量限制爲來自特定客戶端的消息。我在收到第一條消息之前和之後,以'strace NC-4lu $((0x4444))'爲後面跟着'grep 4444/proc/net/udp'(在不同的終端)。 'nc'不接受來自其他客戶的消息。 – nhed 2012-02-02 17:58:36