Socket 相关知识

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学习

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值