2013-07-22 58 views
0

我打破了我的想法試圖瞭解如何讓自己寫的客戶端/服務器接受多個套接字連接。套接字控制接受多個UDP連接

該連接是一個數據報(UDP),現在基於getaddrinfo(3) man page實現的工作很好,但每個客戶端都需要等待早期連接進程的處理。

我聽說過選擇,但在它的手冊頁說:

select()方法可以用來解決在 便攜和高效的方式,天真的程序員嘗試在 解決的問題很多更復雜的方式使用線程,分叉,IPC,信號,內存 共享,等等。

更:

的Linux特定epoll的(7)API提供一個接口,比選擇(2)和輪詢(2)監測當大量 文件的 更 高效描述。

那麼,這是什麼? epoll簡直比選擇更好?或者它取決於?如果取決於什麼?

epoll手冊頁有部分樣本,所以我試圖理解它。

現在,(在服務器上)我想,我需要一個線程在線程中偵聽並在另一個線程中寫入。但是如何控制部分消息的完成?如果兩個客戶端發送部分消息交錯,如何識別?由sockaddr?如果它是唯一的需要,我可以在沒有游泳池的情況下管理它,那麼爲什麼要使用epoll?

任何人都可以嘗試向我解釋如何製作或在哪裏瞭解多連接客戶端服務器UDP應用程序?

+0

1.是,'epoll'比'select'更好。 2.閱讀本書[Unix Network Programming](http:// www。unpbook.com/) –

+0

我會閱讀它,謝謝你的迴應......如果你將你的評論推薦給回覆,我會對它進行投票。 – ton

+1

沒有「接受多個UDP連接」這樣的東西。只有從一個或多個遠程源讀取UDP數據報。 – EJP

回答

1

我認爲這裏有一個關於UDP的誤解。 UDP不是面向連接的協議,這意味着不存在像TCP那樣的永久連接。 UDP只是綁定到一個地址/端口並等待每個人的數據包。在服務器上,每個地址/端口號只能偵聽一個套接字。收到數據包後,您可以通過數據包的源IP查找發件人是誰,您可以通過此IP回覆發件人。

正如我所看到的,不需要poll()select()你綁定到一個地址/端口,並異步接收數據包。也就是說,當收到一個數據包時,你會得到一個信號/消息來提醒你的異步功能。這個函數應該是可重入的,這意味着在接收中間可以接收另一個信號,並且在訪問/修改全局東西(變量/對象)時必須小心。處理傳入數據包時應儘快處理,或者如果處理時間過長,則最好將數據包保存在數據包緩衝池中,並將它們處理爲另一個[優先級較低的]線程。

對於UDP數據包大小讀取this問題。

對於UDP碎片讀this

對於UDP分組首部讀取this