2013-10-31 52 views
1

令人驚訝的是,我有一個很難找到一個答案..Linux的C++ TCP套接字 - 啓用禁止模式

我有一個TCP客戶端套接字,我可以成功地連接,並通過發送數據。但是,在發送數據之後,我期待從服務器返回響應。我檢查了我的套接字,看起來它處於非阻塞模式。

if (fcntl(sc->connect_d, F_GETFL) && O_NONBLOCK) 
{ 
//non blocking 
} 

什麼是啓用阻塞模式的宏,所以我可以讀取服務器響應更容易一點?有人可以給我一個可以做到這一點的小片段嗎?謝謝

+0

possible dup http://stackoverflow.com/questions/1543466/how-do-i-change-a-tcp-socket-to-be-non-blocking –

+0

我已經看過這個,我想改變我的套接字TO阻塞,而不是阻塞 – tier1

+0

其中一個答案給了一個跨平臺的幫手,通過調用fcntl(fd,F_SETFL,flags)設置套接字的阻塞模式... –

回答

5
if (fcntl(sc->connect_d, F_GETFL) && O_NONBLOCK) 

以上代碼不正確。它應該是:

if (fcntl(sc->connect_d, F_GETFL) & O_NONBLOCK) 

需要注意的是TCP套接字默認情況下阻塞模式,所以(假設你自己創建的套接字),你應該不需要做任何事情來「把它放進」阻塞模式創建的。

+0

正確,我明白。我的根本問題是,recv不會阻塞並且不會返回錯誤代碼。所以我在想,它一定是被設置爲非阻塞的。 – tier1

+0

@tkcsam - 聽起來像別的事情正在發生。當然你還沒有收到一些數據? –

+0

我收到一些數據,但它是4個字節的垃圾。 – tier1