window和linux下,设置socket为阻塞模式
2014-07-04 09:22
399 查看
1.创建socket默认为阻塞。一下一段小程序,给定的是跨平台window和linux,设置socket为阻塞模式
void SetSocketUnBlock(SOCKET hSocket)
{
#ifdef WIN32
u_long mode = 1;
if (SOCKET_ERROR == ioctlsocket(hSocket, (long)FIONBIO, &mode)) //非阻塞,异步模式。
//允许或禁止套接口s的非阻塞模式。argp指向一个无符号长整型,如允许非阻塞模式则非零,如禁止非阻塞模式则为零。
{
COM_ASSERT(0); // coding error checking
return;//lint !e527 ignored the unreachable warning
}
#else
int iGetFL = fcntl(hSocket, F_GETFL);//linux下,设置非阻塞,异步模式
if (-1 == iGetFL)
{
COM_ASSERT(0);
return;
}
if (-1 == fcntl(hSocket, F_SETFL, iGetFL | O_NONBLOCK))
{
COM_ASSERT(0);
return;
}
#endif
}
详细说明,可参考ioctlsocket(),fcntl()
---------------------------------------------------------------------------------
2.设置socket为非阻塞模式
void SetSocketBlock(SOCKET hSocket)
{
#ifdef WIN32
u_long mode = 0;
if (SOCKET_ERROR == ioctlsocket(hSocket, (long)FIONBIO, &mode))
{
COM_ASSERT(0); // coding error checking
return; //lint !e527 ignored the unreachable warning
}
#else
int iGetFL = fcntl(hSocket, F_GETFL);
if (-1 == iGetFL)
{
COM_ASSERT(0);
return;
}
if (-1 == fcntl(hSocket, F_SETFL, iGetFL & (~O_NONBLOCK)))
{
COM_ASSERT(0);
return;
}
#endif //! END WIN32
}
void SetSocketUnBlock(SOCKET hSocket)
{
#ifdef WIN32
u_long mode = 1;
if (SOCKET_ERROR == ioctlsocket(hSocket, (long)FIONBIO, &mode)) //非阻塞,异步模式。
//允许或禁止套接口s的非阻塞模式。argp指向一个无符号长整型,如允许非阻塞模式则非零,如禁止非阻塞模式则为零。
{
COM_ASSERT(0); // coding error checking
return;//lint !e527 ignored the unreachable warning
}
#else
int iGetFL = fcntl(hSocket, F_GETFL);//linux下,设置非阻塞,异步模式
if (-1 == iGetFL)
{
COM_ASSERT(0);
return;
}
if (-1 == fcntl(hSocket, F_SETFL, iGetFL | O_NONBLOCK))
{
COM_ASSERT(0);
return;
}
#endif
}
详细说明,可参考ioctlsocket(),fcntl()
---------------------------------------------------------------------------------
2.设置socket为非阻塞模式
void SetSocketBlock(SOCKET hSocket)
{
#ifdef WIN32
u_long mode = 0;
if (SOCKET_ERROR == ioctlsocket(hSocket, (long)FIONBIO, &mode))
{
COM_ASSERT(0); // coding error checking
return; //lint !e527 ignored the unreachable warning
}
#else
int iGetFL = fcntl(hSocket, F_GETFL);
if (-1 == iGetFL)
{
COM_ASSERT(0);
return;
}
if (-1 == fcntl(hSocket, F_SETFL, iGetFL & (~O_NONBLOCK)))
{
COM_ASSERT(0);
return;
}
#endif //! END WIN32
}
相关文章推荐
- Linux UDP socket 设置为的非阻塞模式与阻塞模式区别
- [linux] 将socket设置为非阻塞(non-blocking)
- unix/linux socket设置非阻塞
- 设置socket为为阻塞模式
- Linux下socket阻塞模式与非阻塞模式
- C++编程:socket设置为非阻塞方式(windows和linux)1
- C/C++网络编程在windows和linux中将socket设置为阻塞和非阻塞
- unix/linux socket设置非阻塞
- [linux] 将socket设置为非阻塞(non-blocking)
- socket设置为非阻塞方式(windows和linux)
- 如何设置linux socket为非阻塞
- linux网络编程:设置非阻塞socket收发数据
- unix/linux socket设置非阻塞io
- [linux] 将socket设置为非阻塞(non-blocking)
- socket设置为非阻塞方式(windows和linux)
- Linux下socket设置为非阻塞方式和fcntl系统调用
- linux网络编程:设置非阻塞socket收发数据
- 非阻塞模式的设置、设置socket为非阻塞模式 解决connect阻塞问题
- socket通信阻塞模式下,设置发送和接受函数超时
- C语言socket编程设置接收超时(Window&Linux)