簡體   English   中英

accept()如何確定要返回的整數?

[英]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.

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