I have read this regarding setting a socket to non-blocking mode.
我已经读过关于将套接字设置为非阻塞模式。
http://www.gnu.org/software/libc/manual/html_mono/libc.html#File-Status-Flags
http://www.gnu.org/software/libc/manual/html_mono/libc.html File-Status-Flags
Here is what I did:
以下是我所做的:
static void setnonblocking(int sock)
{
int opts;
opts = fcntl(sock,F_GETFL);
if (opts < 0) {
perror("fcntl(F_GETFL)");
exit(EXIT_FAILURE);
}
opts = (opts | O_NONBLOCK);
if (fcntl(sock,F_SETFL,opts) < 0) {
perror("fcntl(F_SETFL)");
exit(EXIT_FAILURE);
}
return;
}
How can I set the socket back to Blocking mode? I don't see a O_BLOCK flag?
如何将套接字设置回阻塞模式?我没有看到O_BLOCK标志?
Thank you.
谢谢你!
3 个解决方案
#1
14
Did you try clearing the O_NONBLOCK flag?
您试过清除O_NONBLOCK标志吗?
opts = opts & (~O_NONBLOCK)
#2
5
Here is a more cross-platform capable solution:
这是一个更加跨平台的解决方案:
bool set_blocking_mode(const int &socket, bool is_blocking)
{
bool ret = true;
#ifdef WIN32
/// @note windows sockets are created in blocking mode by default
// currently on windows, there is no easy way to obtain the socket's current blocking mode since WSAIsBlocking was deprecated
u_long non_blocking = is_blocking ? 0 : 1;
ret = NO_ERROR == ioctlsocket(socket, FIONBIO, &non_blocking);
#else
const int flags = fcntl(socket, F_GETFL, 0);
if ((flags & O_NONBLOCK) && !is_blocking) { info("set_blocking_mode(): socket was already in non-blocking mode"); return ret; }
if (!(flags & O_NONBLOCK) && is_blocking) { info("set_blocking_mode(): socket was already in blocking mode"); return ret; }
ret = 0 == fcntl(socket, F_SETFL, is_blocking ? flags ^ O_NONBLOCK : flags | O_NONBLOCK));
#endif
return ret;
}
#3
0
Alternative way to clear the flag:
清除旗帜的替代方法:
opts ^= O_NONBLOCK;
This will toggle the non-blocking flag, i.e. disable non-blocking if currently enabled.
这将切换非阻塞标志,即如果当前启用,禁用非阻塞标记。
#1
14
Did you try clearing the O_NONBLOCK flag?
您试过清除O_NONBLOCK标志吗?
opts = opts & (~O_NONBLOCK)
#2
5
Here is a more cross-platform capable solution:
这是一个更加跨平台的解决方案:
bool set_blocking_mode(const int &socket, bool is_blocking)
{
bool ret = true;
#ifdef WIN32
/// @note windows sockets are created in blocking mode by default
// currently on windows, there is no easy way to obtain the socket's current blocking mode since WSAIsBlocking was deprecated
u_long non_blocking = is_blocking ? 0 : 1;
ret = NO_ERROR == ioctlsocket(socket, FIONBIO, &non_blocking);
#else
const int flags = fcntl(socket, F_GETFL, 0);
if ((flags & O_NONBLOCK) && !is_blocking) { info("set_blocking_mode(): socket was already in non-blocking mode"); return ret; }
if (!(flags & O_NONBLOCK) && is_blocking) { info("set_blocking_mode(): socket was already in blocking mode"); return ret; }
ret = 0 == fcntl(socket, F_SETFL, is_blocking ? flags ^ O_NONBLOCK : flags | O_NONBLOCK));
#endif
return ret;
}
#3
0
Alternative way to clear the flag:
清除旗帜的替代方法:
opts ^= O_NONBLOCK;
This will toggle the non-blocking flag, i.e. disable non-blocking if currently enabled.
这将切换非阻塞标志,即如果当前启用,禁用非阻塞标记。