2010-11-16 81 views
0

我想用c語言編寫udp聊天服務器。我以前寫過tcp聊天服務器,沒關係。udp聊天服務器在c

在tcp服務器中,accept函數返回一個fd號,服務器根據這個fd號與特定的客戶端進行通信。

但在udp中,我怎麼能聽特定的客戶端?

在我的tcp服務器中,在客戶端連接到服務器之後,創建了一個線程並且它監聽該客戶端。因此,對於每個客戶端,都有一個線程根據從接受函數返回的fd號進行偵聽。所以任何消息都可以根據這個fd號碼發送給特定的客戶端。

我該如何在udp服務器上實現這個功能?

感謝您的回答。

回答

1

您使用recvfrom找出源IP /端口,然後用sendto回覆。您只需要bind即可選擇一個服務器端口。你不要accept。所有connect確實爲UDP設置了默認目標(您打算用sendto覆蓋)。

+0

我使用了recvfrom和sendto函數。首先客戶端通過sendto向服務器發送消息。服務器通過recvfrom接收消息。在recvfrom我通過sockaddr_in結構獲取客戶端的地址。我無法找到後綁定這個並使用sendto – cemal 2010-11-16 21:31:12

+0

你不*綁定*,那就是目的地。你可以單獨離開你的套接字,只需調用sendto。 – 2010-11-16 21:32:38

0

只需創建一個UDP套接字並調用connect()。但你不想這樣做。 UDP服務器的全部喜悅是它們只需要一個套接字。想一想。你只需要TCP中的線程,因爲你不得不擁有一個專用的套接字,而專用的線程是處理它的最簡單(也是唯一)的方式。在UDP中,你可以繼續讀取同一個套接字,並且源地址告訴你每個圖表來自哪個客戶端。

+1

這裏是我的代碼示例: – cemal 2010-11-16 21:29:56

0

我使用了recvfrom和sendto函數。首先客戶端通過sendto向服務器發送消息。服務器通過recvfrom接收消息。在recvfrom我通過sockaddr_in結構獲取客戶端的地址。我無法達到這個結果後,使用sendto

1

這很簡單。 正如你所知道的UDP是無連接的,它可能共享相同的端口。所以這個想法就在這裏。只需爲每個客戶端創建線程。如果你擁有更多的CPU核心,那將是非常棒的。你可以爲特定數量的客戶端使用每個核心(可以通過map)現在,當同一個客戶端再次敲入時,只需將它發送到該線程和核心即可。因此,如果您擁有1 ... n核心,則必須創建n個線程並將cpu設置爲每個線程。

我已經用這種方式做了8核心服務器的實驗,它的工作正常。

我會給我一些日子博客的代碼後,它cheacking到千兆交換機後.. :)

matrixsust.blogspot.com

希望它可以幫助。