C/C++網路程式設計在windows和linux中將socket設定為阻塞和非阻塞
阿新 • • 發佈:2018-11-08
C/C++網路程式設計在windows和linux中將socket設定為阻塞和非阻塞
在 socket程式設計中,對於socket的讀寫預設都是阻塞的,但有的情況我們需要將其設定為非阻塞,比如做多路複用,或者通過select實現連線超時等功能,將socket設定為非阻塞,在windows和linux中的介面有所不同,在windows中使用ioctlsocket函式,在linux中使用 fcntl函式,下面我們做一個跨平臺設定阻塞的函式SetBlock。
更多內容可以到網上搜索“夏曹俊”獲取我的課程 也可以看我在csdn學院的視訊課程 夏曹俊 http://edu.csdn.net/course/detail/4358bool SetBlock(int sock,bool isblock) { int re = 0; //通過巨集區分windows和linux,如果是windows64位程式判斷 _WIN64巨集 #ifdef WIN32 unsigned long ul = 0; if(!isblock) ul = 1; re = ioctlsocket(sock, FIONBIO, (unsigned long*)&ul); #else //先取到現有描述符屬性,保證本次更改不變動原有屬性 int flags = fcntl(sock, F_GETFL, 0); if (flags < 0) { return false; } if(isblock) { flags = flags & ~O_NONBLOCK; } else { flags = flags | O_NONBLOCK; } re = fcntl(sock, F_SETFL, flags); #endif if (re != 0) return false; return true; }