2011-11-14 59 views
2

工作,我必須寫一個程序,它會檢查有多少客戶能在C.接受()系統調用

連接到一臺服務器(插座)

我用Beej指南編程作爲參考,並有意識到在單個客戶端連接到服務器之後,更多的客戶端不能同時向相同的服務器發送消息。只有在第一次連接關閉後,纔會傳送第二個客戶端的積壓消息。

由於我對套接字編程的新穎性,我不確定「接受」是否是正確的系統調用。另外,BACKLOG的價值在於聽取服務器可以處理的壓力。

任何幫助?

+2

你使用線程還是'select'? – ibid

+1

聽起來像一個作業問題... –

+1

這不是一個家庭作業問題。它是我一直在理解系統調用的東西。我以前沒有在系統級別工作過。 – timonti

回答

2

accept()是正確的系統調用。它返回一個新的文件描述符與新的傳入連接關聯,同時保留原始套接字準備接收更多連接。

但是一旦你接受傳入連接,它通常有主要工藝之一:

  1. 創建一個線程來處理套接字
  2. 一個新的進程繼承了新的文件描述。
  3. 使用select()epoll()等輪詢讀取插座

如果你不這樣做,接受的連接上的任何後續read()將阻塞,這意味着你不能再打電話accept()

012log的積壓參數僅用於告訴內核有多少套接字可以被允許保持在它們之前的初始「連接」狀態 - 通常不需要調整它。

2

Section 7.2 of Beej's guide涵蓋了大多數C程序員首先要學習的方法。 7.2節末尾的示例應該完全符合您的要求。

基本上,您使用select來讓您的程序等待您已經接受的連接或新客戶端嘗試連接的其中一個連接上收到的數據。然後你檢查看看發生了什麼並處理它。 (遺憾的是,如不教一個壞習慣 - 它忘記設置套接字非阻塞模式,因此它可以在accept死鎖如果連接不再懸而未決。)

的基本思路是這樣的:

1)設置基本結構以跟蹤客戶,初始化它們以反映您沒有客戶的事實。

2)爲新連接設置監聽套接字。

3)等待使用select發生的事情。您可以等待新客戶端進行連接,從現有客戶端接收數據,可以將數據發送到現有客戶端,在現有連接上發生錯誤或者傳遞一定時間。使用追蹤客戶的結構來確保您等待從所有現有客戶端收到數據。

4)處理髮生的任何事情。如果新客戶端嘗試連接,則連接並更新您的跟蹤結構。如果從客戶端收到數據,請查看它是否完成了命令,如果是,則處理它。如果您的某個客戶關閉了連接,或者該連接出現錯誤,請關閉套接字並更新跟蹤以清理。

5)返回到步驟3。

這被稱爲 'I/O複用'。還有其他方法可以實現,但這是大多數C程序員首先學習的方式。

+0

我在網上找到了這個問題的可用代碼:http://goo.gl/A7E7v – timonti