[英]How does accept( ) determine which integer to return?
在Linux系統上使用C套接字庫...
當我調用accept( )
它總是返回一個整數。 STDIN
為0。通常,我的第一個接受呼叫返回3。之后,它們遞增。
我在想; accept( )
如何確定下一個整數? 再經過2次accept( )
調用后,如果我已將3、4和5分配給已連接的客戶端; 4個斷開連接時會發生什么? 下一個整數是4還是6?
如果有人可以對此有所了解,我肯定會感激的。
它使用下一個當前未打開的文件描述符,與open()
和其他返回文件描述符的系統調用相同。 dup2()
是該模式的例外。 (例如,如果文件描述符是尚未完全清理的網絡連接的一部分,則可能無法打開文件描述符,但仍可能無法重用。) ( 更新 :刪除的文本會恢復答案的原始版本。文件描述符已關閉,可以重用。由於TCP / IP中的FIN-WAIT狀態,重用套接字地址可能會出現問題-但套接字地址不是文件描述符。)
如果描述符1-5打開,然后關閉4,則下一個類似open的操作將返回4。
可能存在安全意識強的系統,雖然這不是這種模式,但不太可能。 原因之一是存在正確的代碼來處理I / O重定向,該代碼依賴於關閉標准輸入(文件描述符0)以及下一個類似文件描述符的類似open的操作; 對標准輸出(文件描述符1)重復上述步驟。
簡短的答案是,不要指望接受以任何期望的順序給您整數。 無論您認為它多么誘人,它都會成功。
accept返回的實際上是內核資源的“描述符”,它將把該描述符連接到讀寫,關閉,查找(如果有能力)所需的適當驅動程序。 可用描述符池是有限的,因此當您關閉套接字時,它的描述符會返回到池中並可以重用。
它為接受的套接字返回文件描述符:
RETURN VALUES
The call returns -1 on error and the global variable errno is set to
indicate the error. If it succeeds, it returns a non-negative integer
that is a descriptor for the accepted socket.
這將為您提供一個數值,該數值可用於各種文件操作,並在幕后確定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.