系統由多個監聽相同的端口(不同的IP地址 的)節點 的。系統[A]發送數據報到 系統[B]。系統[B]異步 響應併發送數據報回到 [A]全部使用相同的端口。即使[B] 識別[A]的端口,[A]是不是 監聽端口
上我不知道我理解那句話‘一切使用同一端口’這句話。如果A向B發送數據報,B將立即知道A的IP和端口(通過快速檢查您的庫文檔,可以發現OnRawData具有struct sockaddr *sa
參數,如果將其轉換爲sockaddr_in*
,則可以提取IP:端口對)。您可以使用該IP:端口發送數據報,而A將接收它們。 A沒有在該端口上「偵聽」,因爲它沒有在套接字上調用listen(),但是由於A擁有一個綁定到該端口的套接字(無論是通過調用bind()還是通過分配隨機端口OS)它將接收數據。
現在,如果您希望節點之間的所有通信都通過固定端口,那麼您可以這樣做。你只需要通過你的「監聽」套接字發送你所有的數據報。如果每個節點都在同一個端口上「偵聽」,這意味着每個節點都擁有一個綁定到該端口的套接字。如果您希望從A發送到B的數據報顯示來自此固定端口,則必須通過該套接字發送它們。我猜這就是爲什麼bind()不適用於你的發送套接字 - A有一個綁定到端口X的套接字,然後你創建另一個套接字並嘗試將它綁定到同一個端口X,bind()因爲端口已經被採用了(並且你不檢查錯誤:),然後OS分配1024以上的隨機空閒端口。注意1:我在所有地方都使用「聆聽」引號,因爲這個概念在UDP套接字的上下文中並不十分清楚。創建套接字並將其綁定到端口後,可以通過顯式調用bind()或通過發送數據並讓操作系統將其綁定到端口來實現,您可以通過它從任何地方接收數據。不需要listen()或accept()調用。注意2:你說UdpSocket :: Open()調用connect(),但這沒有多大意義 - connect()對UDP套接字做的很少 - 它只是建立一個默認地址,所以你可以使用send()而不是sendto()並且不指定每個發送的地址。
希望能夠解決問題。
編輯到地址OP的評論:我從來沒有使用過這個庫,但根據他們的
UdpSocket documentation Bind()方法有4個重載,並且它們中的每一個都以某種方式接受端口。他們都不適合你嗎?
來源
2009-10-29 10:55:56
sbk
你是在同一個UdpSocket對象還是兩個不同的對象上調用Bind()和Open()? – 2009-10-28 23:03:08
調用Bind(),然後打開(),然後使用相同的實例化對象發送()。 – cedgriss 2009-10-28 23:40:33