天天看点

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

继续阅读