首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

(四) 如何将socket设置阻塞模式

另外,windows和linux平台上accept()函数返回的socekt也是阻塞的,linux另外提供了一个accept4()函数,可以直接将返回的socket设置阻塞模式: int accept...除了创建socket时,将socket设置阻塞模式,还可以通过以下API函数来设置linux平台上可以调用fcntl()或者ioctl()函数,实例如下: fcntl(sockfd, F_SETFL.../details/44306993),linux下如果调用fcntl()设置socket阻塞模式,不仅要设置O_NONBLOCK模式,还需要在接收和发送数据时,需要使用MSG_DONTWAIT标志,...u_long *argp ); 将cmd参数设置FIONBIO,*argp=0即设置阻塞模式,而*argp0即可设置阻塞模式。...但是windows平台需要注意一个地方,如果你对一个socket调用了WSAAsyncSelect()或WSAEventSelect()函数后,你再调用ioctlsocket()函数将该socket设置阻塞模式

4.6K70

ioctlsocket() 用法 socket recvfrom 阻塞 阻塞 设置

如果设置阻塞模式,能很好的解决这个问题,我们可以这样来设置阻塞模式: 调用ioctlsocket函数: unsigned long flag=1; if (ioctlsocket(sock,FIONBIO...当创建一个套接口时,它就处于阻塞模式(也就是说阻塞模式被禁止)。这与BSD套接口是一致的。WSAAsynSelect()函数将套接口自动设置阻塞模式。...此时已经设置阻塞模式,但是并没有设置connect的连接时间,我们可以通过调用select语句来实现这个功能。以下代码设定了是连接时间5秒,如果还未能连上,则直接返回。...当创建一个套接口时,它就 处于阻塞模式(也就是说阻塞模式被禁止)。这与BSD套接口是一致的。WSAAs ynSelect()函数将套接口自动设置阻塞模式。...当创建一个套接口时,它就处于阻塞模式(也就是说阻塞模式被禁止)。这与BSD套接口是一致的。WSAAsynSelect()函数将套接口自动设置阻塞模式。

3.6K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    linux网络编程系列(七)--如何将socket设置阻塞的,阻塞socket阻塞socket在收发数据上的区别

    生成socket设置 socket函数创建socket默认是阻塞的,也可以增加选项将socket设置阻塞的: int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK...使用fcntl设置socket设置阻塞的 if ((nFlags = fcntl (nSock, F_GETFL, 0)) < 0) return 0; nFlags = nFlags...| O_NONBLOCK; if (fcntl (nSock, F_SETFL, nFlags) < 0) return 0; 将socket设置阻塞的 if ((nFlags =...; send函数在阻塞模式下,会立即返回,但是会尽可能的多拷贝数据到缓冲区,但不保证全部拷贝后返回,因此阻塞模式下,send函数返回值可能比参数中发送长度小,而如果缓冲区满了的话,就会立即返回; 3.1.2...阻塞模式也一样。

    3.2K30

    linux源码看socket阻塞阻塞

    linux源码看socket阻塞阻塞 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。 大部分高性能网络框架采用的是非阻塞模式。...笔者这次就从linux源码的角度来阐述socket阻塞(block)和阻塞(non_block)的区别。 本文源码均来自采用Linux-2.6.24内核版本。...一个TCP阻塞client端简单的例子 如果我们要产生一个阻塞socket,在C语言中如下代码所示: // 创建socket int sock_fd = socket(AF_INET, SOCK_STREAM...的阻塞\阻塞状态 我们用fcntl修改socket阻塞\阻塞状态。...阻塞函数sk_wait_data sk_wait_data代码-函数: // 将进程状态设置可打断INTERRUPTIBLE prepare_to_wait(sk->sk_sleep, &wait

    3.5K20

    socket阻塞阻塞,同步与异步、IO模型

    我们把一个SOCKET接口设置阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。...把SOCKET设置阻塞模式,即通知系统内核:在调用Windows Sockets API时,不要让线程睡眠,而应该让函数立即返回。在返回时,该函数返回一个错误代码。...当使用socket()函数和WSASocket()函数创建套接字时,默认都是阻塞的。在创建套接字之后,通过调用ioctlsocket()函数,将该套接字设置阻塞模式。...Linux下的函数是:fcntl()。 套接字设置阻塞模式后,在调用Windows Sockets API函数时,调用函数会立即返回。...当调用该函数时,套接字会自动地设置阻塞方式。 由于使用阻塞套接字在调用函数时,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。

    2.5K30

    LinuxSocket编程(三)——阻塞select的使用简介

    简介 什么叫阻塞阻塞 select fd_set类型的变量相关宏定义 fcntl 实例 select总是返回1的问题。...什么叫阻塞阻塞 阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回。...使用Select就可以完成阻塞(所谓阻塞方式non- block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同...SELECT_fncl.png 示例 客户端创建socket 调用fcntl设置阻塞模式 调用connect开始连接。...来得到套接口上待处理的错误(SO_ERROR),如果连接建立成功,这个错误值将是0,如果建立连接时遇到错误,则这个值是连接错误所对应的errno值(比如:ECONNREFUSED,ETIMEDOUT等) 连接成功后再设置阻塞模式

    4.1K10

    阻塞recvfrom的设置

    // 连接超时 //————————————————————————– // 设置阻塞方式连接...如果设置阻塞模式,能很好的解决这个问题,我们可以这样来设置阻塞模式:调用 ioctlsocket 函数: unsigned long flag=1; if (ioctlsocket(sock,FIONBIO...当创建一个套接口时,它就处于阻塞模式(也就是说阻塞模式被禁止)。这与 BSD 套接口是一致的。 WSAAsynSelect() 函数将套接口自动设置阻塞模式。...为了把套接口重新设置阻塞模式,应用程序必须首先用 WSAAsynSelect() 调用( IEvent 参数置 0 )来禁至 WSAAsynSelect() 。...此时已经设置阻塞模式,但是并没有设置 connect 的连接时间,我们可以通过调用 select 语句来实现这个功能。以下代码设定了是连接时间 5 秒,如果还未能连上,则直接返回。

    1.8K20

    socket阻塞阻塞,同步与异步、IO模型

    阻塞IO模型 : 简介:阻塞IO通过进程反复调用IO函数( 多次系统调用,并马上返回 ); 在数据拷贝的过程中,进程是阻塞的 ; 我们把一个SOCKET接口设置阻塞就是告诉内核...把SOCKET设置阻塞模式,即通知系统内核:在调用Windows Sockets API时,不要让线程睡眠,而应该让函数立即返回。在返回时,该函数返回一个错误代码。...当使用socket()函数和WSASocket()函数创建套接字时,默认都是阻塞的。在创建套接字之后,通过调用ioctlsocket()函数,将该套接字设置阻塞模式。...Linux下的函数是:fcntl(). 套接字设置阻塞模式后,在调用Windows Sockets API函数时,调用函数会立即返回。...当调用该函数时,套接字会自动地设置阻塞方式。   由于使用阻塞套接字在调用函数时,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。

    1.8K20

    socket阻塞阻塞,同步与异步IO模型

    我们把一个SOCKET接口设置阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。...把SOCKET设置阻塞模式,即通知系统内核:在调用Windows Sockets API时,不要让线程睡眠,而应该让函数立即返回。在返回时,该函数返回一个错误代码。...当使用socket()函数和WSASocket()函数创建套接字时,默认都是阻塞的。在创建套接字之后,通过调用ioctlsocket()函数,将该套接字设置阻塞模式。...Linux下的函数是:fcntl().     套接字设置阻塞模式后,在调用Windows Sockets API函数时,调用函数会立即返回。...当调用该函数时,套接字会自动地设置阻塞方式。   由于使用阻塞套接字在调用函数时,会经常返回WSAEWOULDBLOCK错误。所以在任何时候,都应仔细检查返回代码并作好对“失败”的准备。

    3.1K10

    Linux编程(阻塞阻塞IO)

    Linux设备驱动中的阻塞阻塞I/0,简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式。...阻塞应用程序通常使用select系统调用查询是否可以对设备进行无阻塞的访问最终会引发设备驱动中 poll 函数执行。...=1); //串口上没有输入则返回,所以循环读取 printf("%c/n",buf); 阻塞操作常常用等待队列来实现,而非阻塞操作用轮询的方式来实现。...; //读写文件描述符集 //以阻塞方式打开/dev/globalfifo设备文件 fd=open("/dev/globalfifo",O_RDWR|O_NONBLOCK...return mask; } 三、总结 阻塞阻塞操作: 定义并初始化等待对列头; 定义并初始化等待队列; 把等待队列添加到等待队列头 设置进程状态(TASK_INTERRUPTIBLE(可以被信号打断

    5.5K20

    linux阻塞阻塞(connect连接超时)

    解析文档,阻塞connect如何使用: ①当我们将sock设置阻塞之后,使用connect去连接服务端,即使服务端开启了,connect系统调用也不会连接成功,connect而是以失败告终,并返回错误...只是当前连接还没有建立完整),所以我们可以在通过给select、pol或epoll设置等待时间,来等待这个connect的连接成功,从而进一步处理 如果阻塞connect返回的错误不是EINPROGRESS...connect建立成功之后还可以利用getsockopt来读取错误码并清除该socket上的错误: 如果错误码0,表示连接成功建立 否则连接失败 二、阻塞connect的移植性问题 移植性问题如下...: 1.首先,阻塞socket可能导致connect始终失败 2.其次,select对处于EINPROGRESS状态下的socket可能不起作用 3.最后,对于出错的socket,getsockopt...********************************************************* 函 数 名 : setnonblocking 功能描述 : 将参数所指的fd设置阻塞

    6.3K10

    从Java Socket阻塞到Netty入门流程

    本博客 猫叔的博客,转载请申明出处 阅读本文约 “4分钟” 适读人群:同学 Java IO,Socket阻塞通信流程 这里我们使用一个内嵌的永久循环,来让Socket成为一个阻塞的通信流程...如上图所示,ServerSocket是我们自建的一个类,通过启动线程,且线程内置一个真循环,防止accept阻塞; 在客户端监听类上,将监听到的socket作为参数,传递到客户端监听类上,并再次启动线程...,获取一个InputStream,同时再次在这个刚刚启动线程内置一个真循环,的是不断获取信息并回写; 这里要注意的是,第一个真循环是保证获取新连接不会阻塞,第二个真循环是保证不停的获取客户端信息并回写...NioEventLoop(事件循环) 1、新连接接入 2、连接上的数据读取 Channel(抽象连接) Socket、SocektChannel(IO\NIO)抽象 ChannelHandler(业务逻辑处理

    60720

    使用epoll时需要将socket设为阻塞吗?

    一、结论 提出这个问题说明对网络编程的一些基础原理未搞明白,先说下结论: 一个 socket 是否设置阻塞模式,只会影响到 connect/accept/send/recv 等四个 socket API...四、使用 epoll 模型是否要将 socket 设置阻塞的 答案是需要的。 epoll 模型通常用于服务端,那讨论的 socket 只有 listenfd 和 clientfd 了。...listenfd 为什么一定要设置阻塞的,我在另外一篇文章中写的很清楚: 高性能网络通信库中为何要将侦听 socket 设置阻塞的?...在这本书的第四章等章节,我详细地通过循序渐进的方式介绍了网络编程的二十多个重难点知识,当然也包括上文说的阻塞/阻塞模式、epoll 模型等,这是图书的第四章目录,有兴趣的读者可以阅读一下: 第4章 网络编程重难点解析...上的select函数 302 4.5.2 Windows上的select函数 317 4.6 socket阻塞模式和阻塞模式 318 4.6.1 如何将socket设置阻塞模式 318 4.6.2

    2.3K10

    一文你讲解清楚并发,同步,异步,互斥,阻塞阻塞

    3)阻塞阻塞阻塞阻塞是当进程在访问数据时,根据IO操作的就绪状态不同而采取的不同处理方式,比如主程序调用一个函数要读取一个文件的内容,阻塞方式下主程序会等到函数读取完再继续往下执行,阻塞方式下...一般来说可以分为:同步阻塞,同步阻塞,异步阻塞,异步阻塞。 4)同步阻塞,同步阻塞,异步阻塞,异步阻塞: 以发送方发出请求要接收方读取某文件内容例。...2)阻塞阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于阻塞。3)阻塞是使用同步机制的结果,阻塞则是使用异步机制的结果。 面试题目举例 1、什么是线程同步和互斥?...事件(Event):通过线程间触发事件实现同步互斥 信号量(Semaphore):与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据,原理与操作系统中PV操作类似,先设置一个访问公共区域的线程最大连接数...4、补充知识点 进程间通讯: (1)管道/无名管道(2)信号(3)共享内存(4)消息队列(5)信号量(6)socket 线程通讯(锁): (1)信号量(2)读写锁(3)条件变量(4)互斥锁(5)自旋锁

    7.9K21

    Linux 的 epoll 使用 LT + 阻塞 IO 和 ET + 阻塞 IO 有效率上的区别吗?

    他的问题: Linux 的 epoll 使用 LT + 阻塞 IO 和 ET + 阻塞 IO 有效率上的区别吗? 问题补充:请看清楚。。...(listenfd, SOL_SOCKET, SO_REUSEPORT, (char*)&on, sizeof(on)); //将监听socker设置阻塞的 int oldSocketFlag...(listenfd, SOL_SOCKET, SO_REUSEPORT, (char*)& on, sizeof(on)); //将监听socker设置阻塞的 int oldSocketFlag...(listenfd, SOL_SOCKET, SO_REUSEPORT, (char*)& on, sizeof(on)); //将监听socker设置阻塞的 int oldSocketFlag...平台也可以使用 write)去发送数据,如果数据本次不能全部发送完(对于阻塞socket,此时 send 函数返回 -1,错误码 EAGAIN 或 EWOULDBLOCK),你一定要继续注册检测可写事件

    2.3K51
    领券