簡體   English   中英

更多異步套接字問題:

[英]More asynchronous socket questions:

這里的最初問題

所以我一直在閱讀異步套接字,還有兩個問題。 主要是具體的。

1:我可以在select()中使用阻塞套接字,而不會造成影響,對嗎?

2:當我使用FD_SET()時,我要附加當前的fd_set *而不更改它,對嗎?

3:使用FD_CLR()時,我可以簡單地傳入要刪除的套接字的套接字ID,對嗎?

4:當我使用FD_CLR()刪除套接字時,是否有一種首選的方法來重置最大文件描述符(nfds)?

5:假設我將所有連接的套接字都放在一個向量中,當select()返回時,我可以通過該向量進行測試,並檢查if (FD_ISSET (theVector[loopNum], &readFileSet))以查看是否需要讀取任何數據,對嗎? 如果返回true,我可以簡單地使用與同步套接字上相同的接收函數來檢索該數據?

6:如果select()嘗試從封閉的套接字讀取,會發生什么情況? 我知道它返回-1,但是它設置了errno還是有其他方法可以繼續使用select()?

7:你為什么這么厲害? = D


感謝您的寶貴時間,對於您的頭痛,我們深表歉意,希望您能為您提供幫助!

所以我一直在閱讀異步套接字

從接下來發生的事情來看,我認為您沒有。 您似乎已經在閱讀有關非阻塞套接字的信息。 不一樣的東西。

1:我可以在select()中使用阻塞套接字,而不會造成影響,對嗎?

否。考慮偵聽套接字變得可讀的情況,指示即將發生的accept() ,但與此同時客戶端關閉連接。 如果然后調用accept() ,則將阻塞直到下一個傳入連接,從而阻止您為其他套接字提供服務。

2:當我使用FD_SET()時,我要附加當前的fd_set *而不更改它,對嗎?

不,您正在設置。 如果已經設置,則沒有任何變化。

3:使用FD_CLR()時,我可以簡單地傳入要刪除的套接字的套接字ID,對嗎?

正確。

4:當我使用FD_CLR()刪除套接字時,是否有一種重置最大文件描述符(nfds)的首選方法?

不完全是,只需重新掃描並重新計算即可。 但是您實際上並不需要真正重置它。

5:假設我將所有連接的套接字都放在一個向量中,當select()返回時,我可以通過該向量進行測試,並檢查是否(FD_ISSET(theVector [loopNum],&readFileSet))以查看是否需要讀取任何數據,對嗎?

正確,但是通常更簡單地遍歷FD集本身。

如果返回true,我可以簡單地使用與同步套接字上相同的接收函數來檢索該數據?

是的,在您的堵頭插座上。

6:如果select()嘗試從封閉的套接字讀取,會發生什么情況?

select() 不會嘗試從封閉的套接字讀取。 它可能會嘗試在封閉的套接字上進行選擇 ,在這種情況下,它將以errno == EBADF返回-1,如文檔中所述。

我知道它返回-1,但是它設置了errno還是有其他方法可以繼續使用select()?

往上看。

  1. 不清楚? FD_SET將套接字插入集合。 如果套接字已經在那里,則什么都不會改變。
  2. FD_CLR從集合中刪除一個套接字,如果該套接字不存在,則沒有任何更改
  3. 您可以保留一組並行的套接字<>,然后從那里獲取最大值。 或者,您也可以設置一個布爾值,說“在下次選擇之前重新掃描nfd”(注意:在Windows上,nfd被忽略)
  4. 正確
  5. 如果select失敗,快速的解決方法是迭代套接字,並在每個套接字上執行select()來查找虛假的套接字。 優化你的代碼不應該允許選擇() 關閉,雖然插座上,如果另一端關閉它,它是完全有效的選擇上。
  6. 我要讓你和我老婆談談。

暫無
暫無

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

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