簡體   English   中英

為accept()系統調用工作

[英]Working for accept() system call

我必須編寫一個程序來檢查C中有多少個客戶端可以連接到單個服務器(套接字)。

我以Beej的編程指南作為參考,並意識到在單個客戶端連接到服務器后,更多的客戶端無法同時將消息發送到同一服務器。 僅在第一個連接關閉后,才會傳遞第二個客戶端的積壓消息。

由於我是套接字編程的新手,所以我不確定“ accept”是否是要使用的正確系統調用。 同樣,在監聽中應該知道BACKLOG的值是什么,以查看服務器可以處理的壓力。

有什么幫助嗎?

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

但是,一旦您接受了該傳入連接,通常需要執行以下主要過程:

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

如果不這樣做,則接受的連接上的任何后續read()都將阻塞,這意味着您無法再次調用accept()

listen()的backlog參數僅用於告訴內核可以允許多少個套接字在其初始的“連接”狀態之前保留-通常不需要非常調優。

《 Beej指南》的第7.2節介紹了大多數C程序員首先要學習的方法。 7.2節末尾的示例應該正是您想要的。

基本上,您可以使用select來讓程序等待已接受的連接之一上的數據被接收,或者等待新的客戶端嘗試連接。 然后檢查以了解發生了什么並處理。 (不幸的是,該示例確實教導了一個壞習慣-它忘記將套接字設置為非阻塞模式,因此如果連接不再掛起,它可能會死鎖於accept 。)

基本思想是這樣的:

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

2)設置用於新連接的監聽套接字。

3)使用select等待事件發生。 您可以等待新客戶端連接,從現有客戶端接收到的數據,可以發送到現有客戶端的數據,在現有連接上發生錯誤或經過一定時間。 使用跟蹤客戶的結構來確保您等待所有現有客戶的數據接收。

4)處理任何發生的事情。 如果新客戶端嘗試連接,請accept連接並更新您的跟蹤結構。 如果從客戶端接收到數據,請查看它是否完成了命令,如果可以,請對其進行處理。 如果您的一位客戶關閉了連接或該連接出現錯誤,請通過關閉套接字並更新跟蹤進行清理。

5)返回步驟3。

這稱為“ I / O復用”。 還有其他方法可以做到,但這是大多數C程序員最先學習的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM