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

c++ 网络编程(八)TCPIP LINUX-epollwindows-IOCP下 socket opoll函数用法 优于select方法的epoll 以及windows下IOCP 解决多

即每次调用select函数时向操作系统传递监视对象信息,至于为什么要传?是因为我们监视的套接字变化的函数,而套接字是操作系统管理的。...== -1) { puts("epoll_wait() error"); break; } //服务端套接字和客服端套接字...所以边缘触发一定要采用非阻塞的套接字数据传输形式。那么怎么将套接字的read,write数据传输形式修改为非阻塞模式呢?...//fd套接字文件描述符,将此套接字数据传输模式修改为非阻塞 void setnonblockingmode(int fd) { int flag = fcntl(fd, F_GETFL,0);...4:轮询,当接收到了新的连接后,将socket和完成端口进行关联并且投递给IOCP一个I/O请求。

2.2K40

Redis与Reactor模式

,对这样的套接字的读操作将返回0(也就是返回EOF); 该套接字是一个监听套接字且已完成的连接数不为0; 该套接字有错误待处理,对这样的套接字的读操作将返回-1。...返回之后,该套接字连接成功或失败; 该套接字有错误待处理,对这样的套接字的写操作将返回-1。...套接字也不例外,每一个套接字都有对应的fd(即文件描述符)。我们简单看看这几个系统调用的原型。...poll传递的不是固定大小的bitmap,因此select的问题1解决了;poll将感兴趣事件和实际发生事件分开了,因此select的问题2也解决了。但select的问题3和问题4仍然没有解决。...文件事件(file event):Redis客户端通过socket与Redis服务器连接,而文件事件就是服务器对套接字操作的抽象。

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

    「网络IO套路」当时就靠它追到女友

    + 单线程 我们的程序可以通过轮询的方式对套接字进行挨个访问,从而找出进行IO处理的套接字。...在这里插入图片描述 描述符少还行,如果太多,每次的循环将消耗大量的CPU时间,而且可能循环完了都没发现一个套接字可以读写。既然这样,我们直接交给操作系统,让它告诉我们哪些套接字可以读写。...程序就变为这样 poll 我们每次dispatch就相当于对所有的套接字进行排查,这样显然效率不是很高。...而epoll不是,epoll直接返回活动的事件,减少大量的扫描时间。...,它会因为还有500字节而不断地产生read ready notification 异步IO 用程序告知内核启动某个操作,并让内核在整个操作(包括将数据从内核拷贝到应用程序的缓冲区)完成后通知应用程序。

    52231

    知识总结:IO模型基础IO基础

    2、Linux网络I/O模型 Linux内核将所有外部设备都看作一个文件来操作,对文件的操作都会调用内核提供的系统命令,返回一个fd(文件描述符)。...I/O复用模型 Linux提供了select/poll,进程将一个或多个fd传递给select或poll系统调用, 阻塞在select操作上,这样select/poll就可以帮我们侦测多个fd是否处于就绪状态...4、I/O多路复用技术 服务端将多个客户端线程阻塞复用到同一个select,可以使单线程情况下可以处理多个客户端请求。好处是系统开销小。...I/O多路复用应用场景: 服务器需要同时处理多个处于监听状态或者多个连接字状态的套接字。 服务器需要同时处理多种网络协议的套接字。...具体可以通过cat /proc/sys/fs/filemax查看 2、I/O效率不会随着FD数量增大而线性下降。

    67990

    Windows网络模型之Select模型以一个聊天室服务端为例

    ,以及资源的耗费而Select模型具有着低上下文切换成本:可以有效处理成千上万个并发连接,而且事件轮询的开销相对于每连接一个线程要小得多。...select FD_ISSET建立fd_set集合保存需要监控的套接字,并用FD_ZERO宏来初始化我们需要的fd_set。...调用select()监听套接字,它会返回就绪套接字的数量,如果一个套接字没有数据需要接收,select函数会把该套接字从可读性检查队列中删除掉然后使用FD_ISSET()函数检查每个套接字是否在相应的集合中...,从而确定该套接字是否就绪,并执行该套接字对应的内容,比如一个分配给select第一个参数的套接字句柄在select返回后仍然在select第一个参数的fd_set里,那么说明当前数据已经来了, 马上可以读取成功而不会被阻塞...如果该描述符在select()返回时是就绪的,那么FD_ISSET将返回非零值;如果该描述符没有变为就绪状态,FD_ISSET将返回零。

    29520

    Redis为什么这么快?

    Redis服务器通过套接字与客户端进行连接, 而文件事件可以理解为服务器对套接字操作的抽象. 服务器与客户端的通信会产生相应的文件事件, 而服务器则通过监听并处理这些事件来完成一系列网络通信操作...., events是一个数组, 而套接字就是作为下标来进行索引对应aeFileEvent, 例如我当前关心的套接字是9, 那么events[9]就是它对应的文件事件数据结构(csapp中提到过, 当我们调用系统函数返回描述符数字时...2. aeFiredEvent 内部以掩码的形式存储了当前已经触发的事件和对应的套接字, 实际上fired数组只有在调用aeApiPoll的时候才会被赋值, 例如当前发现有套接字6, 8有可读事件, 而套接字...二、文件事件 在介绍中有提到过文件事件实际上就是服务器对套接字操作的抽象, 当套接字有可读\写事件触发的时候, 我们需要调用相应的处理函数, 下面先看一下跟文件事件相关的结构体:...id, 我们发现这里的删除实际上是一种惰性删除, 将aeTimeEvent中的id标记为AE_DELETED_EVENT_ID, 而不是直接将aeTimeEvent对象从链表中删除并且释放, 个人认为这么实现的原因更多是为了安全考虑以及代码的简洁性

    66810

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

    而快递来了,就放在A楼一层,等你去取。 对象的阻塞模式和阻塞函数调用 对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。...当线程遇到I/O 操作时,不会以阻塞的方式等待I/O 操作的完成或数据的返回,而只是将I/O 请求发送给操作系统,继续执行下一条语句。...这意味着当调用Windows Sockets API不能立即完成时,线程处于等待状态,直到操作完成。 并不是所有Windows Sockets API以阻塞套接字为参数调用都会发生阻塞。...阻塞模式套接字的不足表现为,在大量建立好的套接字线程之间进行通信时比较困难。...其最大的缺点是当希望同时处理大量套接字时,将无从下手,其扩展性很差.

    2.2K20

    腾讯C++后台开发面试笔试知识点参考笔记

    集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。...写到已连接 UDP 套接字上的内容都会自动发送到由 connect 指定的协议地址; 不必使用 recvfrom 函数以获悉数据报的发送者,而改用 read、recv 或 recvmsg 函数。...目的地为这个已连接 UDP 套接字的本地协议地址,发源地不是该套接字早先 connect 到的协议地址的数据报,不会投递到该套接字。...这样已连接 UDP 套接字只能与一个对端交换数据报; 由已连接 UDP 套接字引发的异步错误会返回给它们所在的进程,而未连接 UDP 套接字不会接收任何异步错误; tcp套接字 服务端: listenfd...可以显式调用 Camera 版本以显示公共信息,而不是在 PerspectiveCamera 的 display 实现中复制 Camera 的操作。

    1K10

    Java 转 C++ 知识点

    返回值也尽量传引用,但是在函数内部创建的res不能返回引用,栈上分配的“内存空间”结束后直接被回收,因此直接传值,或者将返回对象作为参数传入,最后返回该引用。...int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 监听fd的event事件,将fd op(增删改)到epfd红黑树上...因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。...对于 0xA1A2 大端存储:0xA1 0xA2,符合人的阅读习惯,低位地址存高位字节 小端存储:0xA2 0xA1 低位地址存低位字节 注意字节序指的是字节的顺序,所以顺序对调的最小单位是字节(而不是...(如tcp)和报式套接字(如udp),由于流式面向连接,即点对点通信,因此如果要做广播、多播/组播,只能用报式套接字。

    89020

    accept 函数_accept函数是阻塞的吗

    有趣的是,通常的同步接受函数accept()的返回值是一个新的套接字,而AcceptEx()函数则需要另外一个套接字作为它的参数之一。...这就是,在创建监听套接字时创建一个事件,通过WSAEventSelect()这个API并注册FD_ACCEPT事件通知来把套接字和这个事件关联起来【注二】。...注意,在多数非紧急情况下,如果套接字已经传递给AcceptEx()并开始守候,但还未建立连接,那么你的应用程序不应该关闭它们。...每个AcceptEx()调用都需要创建一个新套接字,所以最好有一个独立的线程专门调用AcceptEx(),而不参与其它I/O处理。你也可以利用这个线程来执行其它任务,比如事件记录。...服务器将需要创建一个监听套接字, 把它与某个完成端口进行关联, 为每颗CPU创建一个工作线程。 再创建一个线程专门用来发出AcceptEx()。

    1.2K20

    TCP并发服务器(多进程与多线程)

    多进程并发服务器 我们在上一节写的TCP服务器只能处理单连接,在代码实现时,多进程并发服务器与非并发服务器在创建监听套接字、绑定、监听这几个步骤是一样的,但是在接收连接请求的时候,多进程并发服务器是这样实现的...但是线程不同,现在只有主线程的cfd,多个线程间的信息是共享的,假如说传递给每个子线程的cfd都是同一个,那么线程1修改该文件描述符指向的内容会影响到线程2的通信,因为它们共享这一个文件描述符。...于是我们需要创建一个结构体数组,每个子线程对应结构体数组中的一个成员,而结构体数组中的每个成员将作为参数传递给子进程的回调函数。 归根到底就是因为,进程是独立的,线程是共享的。...salenptr)) < 0) { //ECONNABORTED 发生在重传(一定次数)失败后,强制关闭套接字 //EINTR 进程被信号中断 //如果accept..., char *ptr) //静态函数保证了读完第一个100字节才去读下一个100字节,而不是每次调用都读100字节 { static int read_cnt; //改变量存在静态数据区

    22010

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

    而此时,当前线程还会继续处理各种各样的消息。 非阻塞 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。...这意味着当调用Windows Sockets API不能立即完成时,线程处于等待状态,直到操作完成。     并不是所有Windows Sockets API以阻塞套接字为参数调用都会发生阻塞。...以阻塞套接字为参数调用该函数接收数据。如果此时套接字缓冲区内没有数据可读,则调用线程在数据到来前一直睡眠。    ...阻塞模式套接字的不足表现为,在大量建立好的套接字线程之间进行通信时比较困难。...其最大的缺点是当希望同时处理大量套接字时,将无从下手,其扩展性很差 非阻塞IO模型 简介:非阻塞IO通过进程反复调用IO函数(多次系统调用,并马上返回);在数据拷贝的过程中,进程是阻塞的;

    3.4K10

    关于IO与并发

    而当内核存在数据后,内核将buf的数据复制到应用buf,调用CPU,而对于NonblockingIO而言,线程仍然阻塞。...首先来看下可读事件与可写事件: 当如下任一情况发生时,会产生套接字的可读事件: 该套接字的接收缓冲区中的数据字节数大于等于套接字接收缓冲区低水位标记的大小; 该套接字的读半部关闭(也就是收到了FIN),...对这样的套接字的读操作将返回0(也就是返回EOF); 该套接字是一个监听套接字且已完成的连接数不为0; 该套接字有错误待处理,对这样的套接字的读操作将返回-1。...当如下任一情况发生时,会产生套接字的可写事件: 该套接字的发送缓冲区中的可用空间字节数大于等于套接字发送缓冲区低水位标记的大小; 该套接字的写半部关闭,继续写会产生SIGPIPE信号; 非阻塞模式下,connect...返回之后,该套接字连接成功或失败; 该套接字有错误待处理,对这样的套接字的写操作将返回-1。

    59330

    高山仰之可极,谈半同步半异步网络并发模型

    一图胜千言: 关于套接字,相信大家都不陌生,我们知道套接字有两种:服务端套接字(被动套接字)和客户端套接字。套接字在listen调用之后,会变成被动套接字,等待客户端的连接(connect)。...其实socket的本质是一种特殊的fd(文件描述符)。 为了表达简洁清晰,用socket指代服务端套接字,fd表示连接之后的客户端套接字。...IO线程也可以是主线程,负责异步地从客户端fd获取客户端的请求数据,而工作线程则是并发的对该数据进行处理。工作线程不关心客户端fd,不关心通信。而IO线程不关心处理过程。...也就是说和HSHA不同,HSHR的队列中存放的不是请求数据,而是fd。工作线程从队列中取的不是数据,而是客户端fd。和HSHA不同,HSHR将IO的过程侵入到了工作线程中。...工作线程的逻辑循环内从队列取到fd后,对fd进行read/recv获取请求数据,然后进行处理,最后直接write/send客户端fd,将数据返回给客户端。

    48140

    面试系列之-Redis高性能io模型

    socket模型中,不同操作调用后会返回不同的套接字类型;socket()方法会返回主动套接字,然后调用listen() 方法,将主动套接字转化为监听套接字,此时可以监听来自客户端的连接请求。...但是要注意的是,调用 accept()时,已经存在监听套接字了; 虽然 Redis线程可以不用继续等待,但是总得有机制继续在监听套接字上等待后续连接请求,并在有请求时通知 Redis;类似的也可以针对已连接套接字设置非阻塞模式...流,就是我们经常听到的select/epoll机制;简单来说在Redis只运行单线程的情况下,该机制允许内核中,同时存在多个监听套接字和已连接套接字;内核会一直监听这些套接字上的连接请求或数据请求。...一旦有请求到达就会交给Redis线程处理,这就实现了一个Redis线程处理多个IO流的效果; 图中的多个FD就是刚才所说的多个套接字;Redis网络框架调用epoll机制,让内核监听这些套接字。...这个过程经历了多次无谓的遍历; poll特点 与select相比,poll没有最大连接数的限制,原因是它是基于链表来存储的,但是同样有一个缺点: 大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义

    33710

    Python:网络编程

    这个方法将阻断(等待)到客户端连接到来为止,然后返回一个格式为 (client, address) 的元组,其中 client 是一个客户端套接字,而 address 是前面解释过的地址。...在后面,你将看到非阻断(异步)网络编程示例,以及如何使用线程来同时处理多个客户端。 为传输数据,套接字提供了两个方法:send 和 recv(表示 receive)。...如果使用了分叉和线程化,这就不是问题:因为一个进程(线程)等待数据时,其他进程(线程)可继续处理其客户端。然而,另一种做法是只处理当前正在通信的客户端。...(请注意,将服务器套接字传递给了 select,让 select 能够在有新连接到来时发出信号。)这个服务器是一个简单的日志程序,将来自客户端的数据都打印出来。...你可使用 sys.stdout.write 而不是 print,但在很多情况下,你可能希望每次得到一行,而不是得到随意的数据。

    1.2K20

    RPC 服务器之【多进程描述符传递】高阶模型

    那就存在一个问题,Master 进程拿到的客户端套接字如何传递给 Slave 进程。 ? 这时,神奇的 sendmsg 登场了。它是操作系统提供的系统调用,可以在不同的进程之间传递文件描述符。...sendmsg 会搭乘一个特殊的「管道」将 Master 进程的套接字描述符传递到 Slave 进程,Slave 进程通过 recvmsg 系统调用从这个「管道」中将描述符取出来。...注意这里的传递描述符,本质上不是传递,而是复制。父进程的描述符并不会在 sendmsg 自动关闭自动消失,子进程收到的描述符和父进程的描述符也不是同一个整数值。...但是父子进程的描述符都会指向同一个内核套接字对象。 有了描述符的传递能力,父进程就可以将 accept 到的客户端套接字轮流传递给多个 Slave 进程,负载均衡的目标就可以顺利实现了。...打印对比发送和接收到的描述符,你会发现它们俩的值并不相同,这是因为 sendmsg 将描述符发送到内核后,内核给描述符指向的内核套接字又重新分配了一个新的描述符对象。

    93720
    领券