簡體   English   中英

如何在 C / C++ 中使用 FD_SET Unix 設置套接字文件描述符

[英]How to set Socket File Descriptor with FD_SET Unix in C / C++

我目前正在從事套接字編程項目。 讓我們假設:

fd_set fd_in;

現在我想為 select function 設置文件描述符:

FD_SET(socket_fd, &fd_in);

那是正確的方法嗎?

然后我使用 select function:

int rc = select(socket_fd + 1, &fd_in, NULL, NULL, NULL);

做了一些研究,我還沒有設法繼續。

感謝您的支持,問候,來自布魯克斯

相應的手冊頁可在線獲取,例如此處

不過,您可能不清楚在將任何文件描述符添加到fd_set之前,您應該先清除它:

FD_ZERO(&fd_in);

然后,是的,您使用FD_SET()就像您在問題中提出的那樣:

 FD_SET(socket_fd, &fd_in);

假設socket_fd的值是一個打開的文件描述符。

這樣做之后,使用指向結果fd_set的指針作為select()的 arguments 之一是合理的,再次如您所見:

 int rc = select(socket_fd + 1, &fd_in, NULL, NULL, NULL);

請注意

  • 該特定調用僅對指定的文件描述符感興趣,該文件描述符可用於讀取(或者如果它是偵聽套接字,則用於接受連接),而不是用於寫入或異常情況。

  • 您必須檢查select()的返回值並根據結果采取適當的措施。 由於您僅使用帶有單個元素的單個fd_set ,沒有超時,因此您應該期望select返回 1(當文件描述符准備好時)或 -1(出錯時)。

  • 一般來說,每次調用select時都需要設置 fd_set(s) 。 除非在某些特殊情況下, select()返回之后的集合內容通常與調用之前的內容不同,並且如果select報告錯誤,那么您就不能再依賴它們的任何內容了。 因此,當在循環中調用select()時,這很常見,通常需要在同一個循環中有 fd_set 設置代碼。

暫無
暫無

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

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