1.非阻塞connect fcntl
int flags = Fcntl(sockfd, F_GETFL,0);
Fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);//非阻塞
2.设置socket为非阻塞模式
int ioctlsocket(
SOCKET s, //要设置的套接字
long cmd, //FIONBIO
u_long FAR* argp //非零值
);
注: 关于第二第三个参数,MSDN是这样解释的:
Use FIONBIO with a nonzero argp parameter to enable the nonblocking mode of socket s. The argp parameter is zero if nonblocking is to be disabled. The argp parameter points to an unsigned long value. When a socket is created, it operates in blocking mode by default (nonblocking mode is disabled).
大概意思就是第二个参数为FIONBIO的时候,第三个参数设置为非0值,则表示此套接字被设置为非阻塞模式,0就表示阻塞模式。当一个套接字创建的时候默认是阻塞的。
转载自https://blog.csdn.net/qq_18297675/article/details/53163591
具体使用如下: arg = 1;
KOSA_socketIOctl(&m_hSockFd, FIONBIO, (void *)&arg);
当调用setsockopt之后,该选项产生的影响取决于linger结构体中 l_onoff和l_linger的值:
0 = l_onoff
当l_onoff被设置为0的时候,将会关闭SO_LINGER选项,即TCP或则SCTP保持默认操作:close立即返回.l_linger值被忽略.
l_lineoff值非0,0 = l_linger
当调用close的时候,TCP连接会立即断开.send buffer中未被发送的数据将被丢弃,并向对方发送一个RST信息.值得注意的是,由于这种方式,是非正常的4中握手方式结束TCP链接,所以,TCP连接将不会进入TIME_WAIT状态,这样会导致新建立的可能和就连接的数据造成混乱。具体原因详见我的上一篇文章《linux 网络编程之TIME_WAIT状态》
l_onoff和l_linger都是非0
在这种情况下,回事的close返回得到延迟。调用close去关闭socket的时候,内核将会延迟。也就是说,如果send buffer中还有数据尚未发送,该进程将会被休眠直到一下任何一种情况发生:
1) send buffer中的所有数据都被发送并且得到对方TCP的应答消息(这种应答并不是意味着对方应用程序已经接收到数据,在后面shutdown将会具体讲道)
2) 延迟时间消耗完。在延迟时间被消耗完之后,send buffer中的所有数据都将会被丢弃。
转载于:https://www.cnblogs.com/my_life/articles/5174585.html
非阻塞accept
可以从https://blog.csdn.net/haibinglong/article/details/6862360学习