socket的非阻塞模式

参考使用了socket非阻塞模式,调用成功。这个是找到的链接资料。有空再把自己总结的上传一下。

非阻塞IO 和阻塞IO:

   在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:
   基本概念:

          阻塞IO::

                 socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会

                 返回。

          非阻塞IO::

                 非阻塞模式下无论操作是否完成都会立刻返回,需要通过其他方

                 式来判断具体操作是否成功。(对于connect,accpet操作,通过select判断,

                  对于recv,recvfrom,send,sendto通过返回值+错误码来判断)

IO模式设置:

                                                    SOCKET
   对于一个socket 是阻塞模式还是非阻塞模式的处理方法::

   方法::

           用fcntl 设置;用F_GETFL获取flags,用F_SETFL设置flags|O_NONBLOCK;

           同时,recv,send 时使用非阻塞的方式读取和发送消息,即flags设置为MSG_DONTWAIT

                                                     实现

fcntl 函数可以将一个socket 句柄设置成非阻塞模式:
flags = fcntl(sockfd, F_GETFL, 0); //获取文件的flags值。

  fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);   //设置成非阻塞模式;

  flags  = fcntl(sockfd,F_GETFL,0);

  fcntl(sockfd,F_SETFL,flags&~O_NONBLOCK);    //设置成阻塞模式;

  并在接收和发送数据时:

 将recv, send 函数的最后有一个flag 参数设置成MSG_DONTWAIT

 recv(sockfd, buff, buff_size,MSG_DONTWAIT);     //非阻塞模式的消息发送

 send(scokfd, buff, buff_size, MSG_DONTWAIT);   //非阻塞模式的消息接受

见链接
https://www.cnblogs.com/guozht/p/11236199.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值