2013-03-30 62 views
0

假設我們有一個帶有socket sa和new_socket的服務器程序。我正在使用的教程需要socket sa和new_socket,並且sockaddr_in的兩個結構名爲serverclient;然後將套接字綁定到IP地址:端口,然後調用listen()函數。當listen返回時,程序調用每個連接需要多少個套接字?

new_socket = accept(sa, (struct sockaddr*)&client, &length); 

我的問題是,讓說,有3人的連接... 我是否需要爲每個accept功能3層不同的結構和3個不同new_sockets,說如果我想我的服務器服務3個不同的客戶端連接到它?

另外,爲什麼我們需要一個用於accept的new_socket?爲什麼bind有兩個不同的插座1,accept有一個?不應該在bind版上執行套接字操作嗎?

我試圖實施套接字類,使其對我來說更容易,作爲一個很好的方法來練習我的接力技能....

+0

您通常有一個套接字監聽傳入連接,並且每個客戶端有一個套接字。 – 2013-03-30 00:41:55

回答

1

您需要爲一般服務器一個插座。此套接字是您設置服務器正在偵聽的端口的位置,並呼叫accept()等待傳入的連接。

另外,每個客戶端連接都需要一個套接字。這是一個新的套接字,由accept()返回。這是必要的,因爲服務器可以處理多個客戶端。如果您對所有內容使用了一個套接字,則無法確定哪個客戶端向您發送了消息,或者指示要發送回覆的客戶端。

+0

感謝您的回覆。因此,讓我們說,如果即時製作服務器,但我不知道有多少人將連接到它。我的程序如何根據連接到它的客戶端的數量知道要創建多少個套接字?我會有一個套接字數組聲明與新或malloc,然後我會添加一個套接字每次聽取消阻止?另外,在教程中,一旦連接到服務器,服務器就會退出。如果我想讓服務器保持活動狀態,那麼我必須循環哪些winsock函數(接受並可能聽?) – Kelvin

+0

您確實監聽一次,並且在每次連接時接受一次返回。將插座存放在任何類型的容器中。您將需要使用select()來檢測哪個套接字(包括您的接受套接字)具有要處理的數據包。 –

+0

是的,你使用一個數組。每當'accept()'返回時,都會將新的套接字添加到數組中。如果數組填滿了,你可以使用'realloc()'來處理更多的客戶端。你只需要調用listen()一次,然後在主循環中調用accept()來獲得新的連接。 – Barmar

相關問題