版权声明:本文为博主夏曹俊原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiedichina/article/details/64437699
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;
}