socket函数

[C++] epoll server实例

时光毁灭记忆、已成空白 提交于 2020-02-25 19:56:43
// IO多路复用,事件驱动+非阻塞,实现一个线程完成对多个fd的监控和响应,提升CPU利用率 // epoll优点: // 1.select需要每次调用select时拷贝fd,epoll_ctl拷贝一次,epoll_wait就不需要重复拷贝 // 2.不需要像select遍历fd做检查,就绪的会被加入就绪list,遍历list完成处理 // 3.没有最大连接限制,与最大文件数目相关:cat /proc/sys/fs/file-max,与内存相关 // epoll实现相关: // 1.epoll_ctl,将fd的event使用RB tree保存,读写O(logN); // 2.一旦有event,内核负责添加到rdlist链表 // 3.epoll_wait检查链表看是否有事件,并进行处理 // Ref // https://www.cnblogs.com/lojunren/p/3856290.html // http://blog.chinaunix.net/uid-28541347-id-4273856.html // Question: // 是否需要每个event一个实例? #include <cstdlib> /* exit() */ #include <cstdio> /* perror(): 打印信息+发生错误的原因,可用于定位。 */ #include

IO复用解述

寵の児 提交于 2020-02-25 19:54:30
I/O多路复用 select select 允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或指定时间后返回它。 select函数原型 #include <sys/select.h> #include <sys/time.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 返回值: 监听到有事件发生的文件描述符的个数,超时为0,错误为 -1. 1.当监视的相应的文件描述符集中满足条件时,比如说读文件描述符集中有数据到来时,内核(I/O)根据状态修改文件描述符集,并返回一个大于0的数。 2.当没有满足条件的文件描述符,且设置的timeval监控时间超时时,select函数会返回一个为0的值。 3.当select返回负值时,发生错误。 参数: maxfd: 是需要监视的最大的文件描述符值+1; rdset、wrset、exset: 是传入传出参数,fd_set类型,分别对应于需要检测的可读文件描述符的集合、可写文件描述符的集合、异常文件描述符的集合。若对其中任何参数条件不感兴趣,则可将其设为NULL。 timeout: 设置超时时间,指定select在返回前没有接收事件时应该等待的时间。 timeval 结构体 struct

I/O多路复用select/poll/epoll

Deadly 提交于 2020-02-25 19:52:32
前言 早期操作系统通常将进程中可创建的线程数限制在一个较低的阈值,大约几百个。因此, 操作系统会提供一些高效的方法来实现多路IO,例如Unix的select和poll。现代操作系统中,线程数已经得到了极大的提升,如NPTL线程软件包可支持数十万的线程。 I/O多路复用 select select 允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或指定时间后返回它。 select函数原型 #include <sys/select.h> #include <sys/time.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 返回值: 监听到有事件发生的文件描述符的个数,超时为0,错误为 -1. 1.当监视的相应的文件描述符集中满足条件时,比如说读文件描述符集中有数据到来时,内核(I/O)根据状态修改文件描述符集,并返回一个大于0的数。 2.当没有满足条件的文件描述符,且设置的timeval监控时间超时时,select函数会返回一个为0的值。 3.当select返回负值时,发生错误。 参数: maxfd: 是需要监视的最大的文件描述符值+1; rdset、wrset、exset: 是传入传出参数,fd_set类型

linux socket 阻塞非阻塞设置 fcntl,F_GETFL,F_SETFL,flags

痴心易碎 提交于 2020-02-24 08:52:27
1、获取文件的flags,即open函数的第二个参数: flags = fcntl(fd,F_GETFL,0); 2、设置文件的flags: fcntl(fd,F_SETFL,flags); 3、增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞: flags = fcntl(fd,F_GETFL,0); flags |= O_NONBLOCK; fcntl(fd,F_SETFL,flags); 4、取消文件的某个flags,比如文件是非阻塞的,想设置成为阻塞: flags = fcntl(fd,F_GETFL,0); flags &= ~O_NONBLOCK; fcntl(fd,F_SETFL,flags); 获取和设置文件flags举例:: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <error.h> char buf[500000]; int main(int argc,char *argv[]) { int ntowrite,nwrite; const char *ptr ; int flags; ntowrite = read(STDIN_FILENO,buf,sizeof(buf)); if(ntowrite <0) {

python网络编程学习笔记(一)

℡╲_俬逩灬. 提交于 2020-02-21 23:43:55
python网络编程 /*××××××××××××××××××××××××× 创建一个能接受客户端的消息, 在消息前加一个时间戳后返回的tcp服务器 ×××××××××××××××××××××××××*/ #!/usr/bin/env python from socket import * from time import ctime HOST='' PORT=21567 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) tcpSerSock.setsockopt(SOL_SOCKET, SO_REUSEADDR, True) tcpSerSock.setsockopt(SOL_SOCKET, SO_REUSEPORT, True) tcpSerSock.bind(ADDR) tcpSerSock.listen(5) while True: print'waiting for connect ...' tcpCliSock, addr = tcpSerSock.accept() print'... connected from :' ,addr while True: data = tcpCliSock.recv(BUFSIZ) if not data: break

IO 多路转接 epoll

☆樱花仙子☆ 提交于 2020-02-20 01:15:28
read 函数返回值 >0 :实际读到的字节数 =0 :socket中,表示对端关闭 close() -1 : 如果errno = EINTR 被异常中断。需要重启。 如果errno =EAGIN 或 EWOULDBLOCK 以非阻塞的方式读数据,但是没有数据。需要再次读 如果errno = ECONNRESET 说明连接被重置。需要close()。 移除监听队列 错误 突破 1024 文件描述符限制 cat /proc/sys/fs/file-max 当前计算机能打开的最大文件个数。受硬件影响 ulimit -a -->当前用户下的进程。默认打开文件件描述符个数 缺省 为 1024 修改: 打开 sudo vi /etc/security/limits.conf 写入 * soft nofile 65536 -->设置默认值 可以直接借助命令修改【注销用户 使其生效】 * hard nofile 100000 --》命令修改上限 命令修改: ulimit -n 21000 突破 1024 文件描述符限制 cat /proc/sys/fs/file-max 当前计算机能打开的最大文件个数。受硬件影响 ulimit -a -->当前用户下的进程。默认打开文件件描述符个数 缺省 为 1024 修改: 打开 sudo vi /etc/security/limits.conf 写入 *

ZeroMQ模式

不打扰是莪最后的温柔 提交于 2020-02-17 17:37:28
文章目录 一、相关知识 二、基本套接字 1、REQ-REP模式 2、PUSH-PULL模式 3、PUB-SUB模式 4、DEALER-ROUTER模式 5、PAIR-PAIR模式 结语 一、相关知识 1、基础API接口 创建和销毁套接字:zmq_socket(), zmq_close() 配置和读取套接字选项:zmq_setsockopt(), zmq_getsockopt() 为套接字建立连接:zmq_bind(), zmq_connect() 发送和接收消息:zmq_send(), zmq_recv() 2、ZMQ与TCP的区别 使用多种协议, inproc(进程内) 、 ipc(进程间) 、 tcp 、 pgm(广播) 、 epgm ; 当客户端使用zmq_connect()时连接就已经建立了,并不要求该端点已有某个服务使用zmq_bind()进行了绑定; 连接是异步的,并由一组消息队列做缓冲; 连接会表现出某种消息模式,这是由创建连接的套接字类型决定的; 一个套接字可以有多个输入和输出连接; ZMQ没有提供类似zmq_accept()的函数,因为当套接字绑定至端点时它就自动开始接受连接了; 应用程序无法直接和这些连接打交道,因为它们是被封装在ZMQ底层的。 3、ZMQ核心消息模型 请求-应答模式:将一组服务端和一组客户端相连,用于远程过程调用或任务分发。 发布-订阅模式

使用 异步多线程TCP Socket 实现进程间通信(VC 6.0 , BCB6.0调试通过)

为君一笑 提交于 2020-02-14 23:57:08
进程间通信有很多种方式,比如说 Pipe,共享内存,DDE,Socket等,关于进程通信方面的知识我在这里就不讨论了,大家可以看我博客里的另一些文章有讲...今天我们主要讨论怎么样使用Socket实现进程间通信。 本程序将使用Socket 的WSAEventSelect异步方式,使用多线程,建立一个服务器类,使用此类的时候只需要将处理数据的函数指针传给该类,进行数据处理,本例中,服务器将启动一个客户端进程,让客户端像服务器发送数据,然后服务端收到数据后将数据打印出来进!从而达到进程通信的目的,当然,如果想进行数据的特殊处理的话,只需要改写处理函就行了,因为,服务器类只是接收函数指针。 本类在C++ builder 6.0 和 VC 6.0调试通过....不过大家注意看程序注释,不同的编译器使用需要修改一点地方,程序注释说的很清楚,我就不在这里介绍了(注意BCB中包含的头文件位置,本类的头文件一定要放在最上面,因为winsock2.h的冲突问题,有关这个问题,有兴趣的朋友自己上网搜,因为时间有限,一篇文章不可能写太多的内容,请大家谅解) 下面我们先来了解一下 Socket 的异步方式 ! (程序源码示例请翻到文章尾下载) 首先,Wi ndows套接字在两种模式下执行I / O操作:锁定和非锁定。 在锁定模式下,在I / O操作完成前,执行操作的Wi nsock函数

DPDK l2fwd源码学习

六月ゝ 毕业季﹏ 提交于 2020-02-14 18:35:41
1. 主函数分析 1 /* 命令行解析 2 * 参数输入 ./l2fwd -c 0x3 -n 4 -- -p 3 -q 1 3 * -c 为十六进制的分配的逻辑内核数量 4 * -n 为十进制的内存通道数量,EAL参数和程序参数用--分开 5 * -q 为分配给每个核心的收发队列数量(端口数量) 6 * -p为十六进制的分配的端口数 7 * -t 为可选默认10s打印时间间隔参数 8 */ 9 int main(int argc, char **argv) 10 { 11 struct lcore_queue_conf *qconf; 12 int ret; 13 uint16_t nb_ports; 14 uint16_t nb_ports_available = 0; 15 uint16_t portid, last_port; 16 unsigned lcore_id, rx_lcore_id; 17 unsigned nb_ports_in_mask = 0; 18 unsigned int nb_lcores = 0; 19 unsigned int nb_mbufs; 20 21 /* init EAL */ 22 /* 初始化EAL参数,并解析参数,系统函数getopt以及getopt_long, 23 * 这些处理命令行参数的函数,处理到“--”时就会停止,分割参

PHP中on回调的实现(十六节)

三世轮回 提交于 2020-02-13 12:54:39
  各位好,我是老李。和老李一同完成《PHP网络编程》,虽然我知道实际上从头到尾可能只有我一个人在搞。我告诉你们一定要好好在家好好学习、远程工作,不要折腾地自己最后连班都没法上了,要好好学习、要不断学习、要终身学习。   上个章节我送了大家一篇番外:   同步异步阻塞非阻塞,了解一下?(十三节)   今天这篇是和上篇番外紧密结合的,因为我答应大家了,要通过今天这一篇中的代码表演一波儿啥叫阻塞、啥叫非阻塞、啥叫异步非阻塞...这年月,听到的异步非阻塞次数太TM多了,似乎每个高IO的程序都离不开这个组合词!   这个词语,席卷八荒,说出去拉风又嚣张   所以呢,今天我们搞一个非常有意思的科研方向,那就是Workerman里的那种on是咋实现的。作为一个24k的泥腿子,php-fpm才是星光大道,复制粘贴是拿手兵器,composer install是撒手锏,CURD一把梭,PHP里的一大坨函数几乎都是[ 同步阻塞 ],复制粘贴起来毫无后顾之忧,上来就是干,最后在在业务里随手搞两个sleep( one ),以后优化响应速度就是这么轻松简单,So easy!哪里不会点哪里~   但是用Workerman或者Nodejs,on是一定避免不了的,天生丽质的[ 异步非阻塞 ]注定会让程序写法变成这样。因为调用方(研究僧)自己不会主动获取数据,靠的是被调用方(阿梅)的通知,所以调用方(研究僧