1. 程式人生 > >[linux] 將socket設定為非阻塞(non-blocking)

[linux] 將socket設定為非阻塞(non-blocking)

原文:http://blog.csdn.net/wwwsq/article/details/970198

有一個非常有迷惑性的做法是:
u_long has = 1;
ioctl(m_sock, FIONBIO , &has);
這個函式會非常無恥的返回你success,但是它實際上很可能什麼也沒做。

正確的做法應該是使用fcntl:
int flags = fcntl(m_sock, F_GETFL, 0);
fcntl(m_sock, F_SETFL, flags|O_NONBLOCK);

這真是一個隱蔽的問題,折騰了我兩天。執行緒每每停留在send()呼叫那裡,我始終沒懷疑到:用ioctl設定FIONBIO成功之後,socket竟然還是阻塞的。