将socket设置为非阻塞(non-blocking)(
2009-04-17 15:44
295 查看
在CSDN上看到一个很短的文章,虽然我没有遇到过这个的问题,不过感觉有必要记记,所以摘过来了
有一个非常有迷惑性的做法是:
u_long has = 1;
ioctl(m_sock, FIONBIO , &has);
这个函数会非常无耻的返回你success,但是它实际上很可能什么也没做。
正确的做法应该是使用fcntl:
int flags = fcntl(m_sock, F_GETFL, 0);
fcntl(m_sock, F_SETFL, flags|O_NONBLOCK);
这真是一个隐蔽的问题,折腾了我两天。线程每每停留在send()调用那里,我始终没怀疑到:用ioctl设置FIONBIO成功之后,socket竟然还是阻塞的
有一个非常有迷惑性的做法是:
u_long has = 1;
ioctl(m_sock, FIONBIO , &has);
这个函数会非常无耻的返回你success,但是它实际上很可能什么也没做。
正确的做法应该是使用fcntl:
int flags = fcntl(m_sock, F_GETFL, 0);
fcntl(m_sock, F_SETFL, flags|O_NONBLOCK);
这真是一个隐蔽的问题,折腾了我两天。线程每每停留在send()调用那里,我始终没怀疑到:用ioctl设置FIONBIO成功之后,socket竟然还是阻塞的
相关文章推荐
- [linux] 将socket设置为非阻塞(non-blocking)
- [linux] 将socket设置为非阻塞(non-blocking)
- [linux] 将socket设置为非阻塞(non-blocking)
- 将socket设置为非阻塞(non-blocking) - 艾子的日志 - 网易博客
- [linux] 将socket设置为非阻塞(non-blocking)
- 关于 socke t设置为非阻塞(non-blocking)状态
- [VC]setsockopt 设置socket 详细用法(超时、非阻塞等)
- socket Non-blocking连接
- boost库之socket 非阻塞/缓冲区大小等属性设置
- boost库之socket 非阻塞/缓冲区大小等属性设置
- [网络编程]_[Socket]_[Socket 阻塞模式(blocking)下的 I/O模型(model) 之 Select 模型(model)初探]
- Linux下socket设置为非阻塞方式和fcntl系统调用
- unix/linux socket设置非阻塞
- 非阻塞套接字(Nonblocking Sockets) 概述
- Java socket阻塞设置超时
- linux网络编程:设置非阻塞socket收发数据
- socket的send、recv阻塞设置阻塞超时时间
- Non-Blocking Socket I/O in JDK 1.4
- 阻塞(Blocking)和非阻塞(Non-Blocking)
- [网络编程]_[Socket]_[Socket 阻塞模式(blocking)下的 I/O模型(model) 之 Select 模型(model)初探]