1. 程式人生 > >C/C++網路程式設計在windows和linux中將socket設定為阻塞和非阻塞

C/C++網路程式設計在windows和linux中將socket設定為阻塞和非阻塞

C/C++網路程式設計在windows和linux中將socket設定為阻塞和非阻塞         

    在 socket程式設計中,對於socket的讀寫預設都是阻塞的,但有的情況我們需要將其設定為非阻塞,比如做多路複用,或者通過select實現連線超時等功能,將socket設定為非阻塞,在windows和linux中的介面有所不同,在windows中使用ioctlsocket函式,在linux中使用 fcntl函式,下面我們做一個跨平臺設定阻塞的函式SetBlock。

bool 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;
}
更多內容可以到網上搜索“夏曹俊”獲取我的課程 也可以看我在csdn學院的視訊課程 夏曹俊 C++socket網路程式設計大全實戰http伺服器(支援php) http://edu.csdn.net/course/detail/4358