2017-09-13 48 views
-5

說,我有一個名爲sock的服務器套接字,它是綁定和偵聽。有人可以請解釋下面的這段代碼是如何處理它的嗎? select()應該檢查襪子有異常情況,但那些是什麼?服務器和客戶端套接字的這些異常情況如何不同?插座和select()內在函數

fd_set sErr; 
FD_ZERO(&sErr); 
FD_SET(sock, &sErr); 
struct timeval timeout = {0}; // select() will return immediately 
if (select (sock + 1, 0, 0, &sErr, &timeout) > 0) 
    return -1; 
+5

您是否閱讀過選擇的手冊頁? – UKMonkey

+0

請選擇C或C++ –

+0

select將標記讀取的所有讀取的套接字讀取爲可讀取的集合,所有準備寫入寫入集合的元素等等。返回值是它設置的位數。 – midor

回答

1

說,我有一個名爲襪子的服務器套接字,這勢必和聽力。有人可以請解釋下面的這段代碼是如何處理它的嗎?

當然可以。如果套接字發生任何錯誤,它將返回-1。這完全沒有意義,也沒有檢查套接字的可讀性,也沒有使用非零超時。除了在其他地方關閉之外,監聽套接字沒有太多可能發生。

fd_set是一個掩碼數組,它通過FD_ZERO(不要獲取asm代碼)以某種方式歸零。

FD_ZERO中沒有彙編代碼。它所做的只是清除陣列。

select()應該返回單插槽

其中有例外(?)

可能會改變fd_set中的某些內容。

是的。

做這些FD_SET戴口罩

他們告訴你哪個套接字(一)可讀,(B)寫的,且(C)的錯誤懸而未決。

是如何套袋

這是不相關的返回值。返回的值是號碼其狀態自上次調用以來已更改的套接字。這在文檔中有明確說明。你讀過了嗎?

這些異常究竟是什麼?

他們是會引起錯誤,即條件read()/recv()/recvfrom()/recvmsg()/send()/sendto()/sendmsg()write()返回-1與關聯的errno值。

+0

那麼,使用異常請求集合對於客戶端套接字纔有意義?而且我還沒有得到什麼條件足以將描述符放在這個集合上,因爲實際的例外沒有發生。很抱歉,很難找到說明或示例來澄清這部分內容,而源代碼真的很模糊。 – ZuOverture

+0

我沒有一天關於客戶端套接字。我沒有看到任何插槽的重點。當然,你對套接字上的錯誤不僅感興趣?如果你不打算做任何I/O,你爲什麼創建它?我不明白你的第二或第三句話。 – EJP

+0

我或多或少地理解了將套接字描述符放入讀寫fd_sets的內容。但異常情況?這不是一個真正的例外,就像你計算1/0時得到的那樣,它只會在你對套接字進行一些操作時纔會發生,比如從它讀取數據?但是,socket中應該做些什麼,它們在exceptfds中?我應該嘗試關閉它們,還是會導致異常呢? – ZuOverture