[英]Working for accept() system call
我必須編寫一個程序來檢查C中有多少個客戶端可以連接到單個服務器(套接字)。
我以Beej的編程指南作為參考,並意識到在單個客戶端連接到服務器后,更多的客戶端無法同時將消息發送到同一服務器。 僅在第一個連接關閉后,才會傳遞第二個客戶端的積壓消息。
由於我是套接字編程的新手,所以我不確定“ accept”是否是要使用的正確系統調用。 同樣,在監聽中應該知道BACKLOG的值是什么,以查看服務器可以處理的壓力。
有什么幫助嗎?
accept()
是正確的系統調用。 它返回與新傳入的連接相關聯,同時使准備接收更多的連接原始套接字的新文件描述符。
但是,一旦您接受了該傳入連接,通常需要執行以下主要過程:
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.