2013-08-16 43 views
-1

我正試圖編寫一個服務器/客戶端對通過udp運行,並且唯一能夠讓它啓動的方法是在連接啓動之前讓服務器知道客戶端的ip和端口。我的新設計包括等待數據包進入,記錄發件人地址,分支給子進程(父進程循環並繼續監聽),然後向客戶端發送數據包。然後孩子只能接收來自關聯客戶端的數據包,但文檔不清楚的是父套接字將繼續接收來自該客戶端的流量。我正在開發一個程序來嘗試它,但我想我可以同時提出這個問題。斷開連接的udp套接字是否仍然接收來自另一個套接字連接的端口的通信?

編輯:看來,當孩子的插座是connected'd它也會連接父母的插座。

+0

我不認爲你明白UDP協議是什麼。它被設計成一個**無連接**協議。 –

+0

@JacobPollack從'connect(2)'手冊頁:「如果套接字sockfd是SOCK_DGRAM類型,那麼addr是默認發送數據報的地址,並且是接收數據報的唯一地址。 –

+0

問題是,是否有來自'addr'的數據包從父節點中的套接字轉向,該套接字綁定到相同的端口? –

回答

1

UDP協議不運行連接,它是一個無連接協議。一方傾聽和其他方面發送數據報以供數據通道工作就足夠了。

關於這個問題(對不起,以前沒有提到過):在使用UDP時,分叉不是出路。該技術廣泛使用基於連接的協議。這可能是因爲:

  • 後可以listen()
  • 第一進程fork權接受連接工作與它(且僅限該進程素顯示新創建的連接插座

當你一起工作。 UDP你沒有這樣的差距(如前面accept()與TCP)知道什麼時候到達叉(尤其是當你有密集的數據報流)

所以,當你設計UDP服務時,你需要任一

  • 使用非阻塞I/O與事件循環或
  • 設計螺紋溶液。
+2

但是你可以在udp socket上使用connect函數。從'connect(2)'手冊頁:「如果套接字sockfd是SOCK_DGRAM類型,那麼addr是默認發送數據報的地址,並且是接收數據報的唯一地址。」 –

+0

@RobbieMckennie,它作爲一個限制,但仍然與「連接」術語沒有任何關係。這隻意味着你可以在連接後使用'send',因爲'sendto'總是需要遠程主機的傳遞地址 –

+1

好吧,但是這仍然不能回答我的問題。 –