网络编程学习笔记1

news2024/11/28 22:33:51

文章目录

  • 一、socket
    • 1、创建socket
    • 2、网络通信流程
    • 3、accept()函数
    • 4、signal()函数
    • 5、recv()函数
    • 6、connect()函数
  • 二、I/O多路复用
    • 1.select模型
    • 2.poll模型
    • 3.epoll模型

一、socket

1、创建socket

int socket(int domain,int type,int protocol);
//返回值:一个有效的socket,失败时返回-1,errno被设置。
(1)domain:
PF_INET       IPv4互联网协议族
PF_INET6      IPv6互联网协议族
PF_LOCAL      本地通信的协议族
PF_PACKET     内核底层协议族
PF_IPX        IPX Novell协议族


(2)type数据传输的类型
2.1 SOCK_STREAM 
面向连接的socket:
1)数据不会丢失
2)数据顺序不会错乱
3)双向通道

2.2 SOCK_DGRAM
无连接的socket:
1)数据可能会丢失
2)数据顺序可能错乱
3)传输的效率更高


(3)protocol最终使用的协议
在IPv4中,数据传输方式为SOCK_STREAM的协议只有IPPROTO_TCP,数据传输方式为SOCK_DGRAM的协议只有IPPROTO_UDP,也可填0.

2、网络通信流程

在这里插入图片描述

3、accept()函数

accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//是在一个套接口接受的一个连接。用于在服务器端接受客户端连接的系统调用。
//参数:
sockfd:套接字描述符,该套接口在listen()后监听连接。
addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。
addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。

4、signal()函数

//设置某一信号的对应动作
#include<signal.h>
void ( *signal( int signum,void(* handler)(int)) )  (int);
或者:typedef void (*sig_t)( int );
sig_t signal(int signum,sig_t handler);
//参数:
1.signum:指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。

2.handler:描述了与信号关联的动作,它可以取以下三种值:
(1)一个无返回值的函数地址
此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为signum的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义:
void func(int sig);2)SIG_IGN
这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。
(3)SIG_DFL
这个符号表示恢复系统对信号的默认处理。

5、recv()函数

int recv(SOCKET s, char FAR*buf, int len, int flags);
//是一个用于从套接字接收数据的函数。
//返回值:如果接收到的字节数大于0,表示实际复制到缓冲区的数据量。如果返回0,表示对方已关闭连接。如果返回SOCKET_ERROR,表示出现了错误。
1.参数:
s:套接字的描述符,指定接收数据的端点。
buf:一个指向缓冲区的指针,用于存放接收到的数据。
len:缓冲区buf的长度。
flags:通常设置为0,但可以用于控制函数的行为,如使用MSG_PEEK查看数据或使用MSG_OOB处理带外数据。

2.函数行为:
(1)如果套接字处于阻塞模式,recv将一直等待直到有数据可读或发生错误。
(2)如果套接字处于非阻塞模式,并且没有数据可读,recv将返回SOCKET_ERROR并设置WSAEWOULDBLOCK错误。
(3)在数据接收过程中,如果网络出现错误,recv将返回SOCKET_ERROR。
(4)如果远程端正常关闭连接,对于面向连接的套接字(如SOCK_STREAM),recv将立即返回,接收0个字节。
(5)如果连接被重置,对于面向连接的套接字,recv将失败并显示错误WSAECONNRESET。

6、connect()函数

#include <sys/socket.h>
int connect(int sockfd, struct sockaddr * serv_addr, int addrlen);
//用于建立与指定socket的连接。
//返回值:成功则返回0, 失败返回-1, 错误原因存于errno 中.
参数:
sockfd:标识一个套接字。
serv_addr:套接字s想要连接的主机地址和端口号。
addrlen:name缓冲区的长度。

二、I/O多路复用

1.select模型

 int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* errorfds, struct timeval* timeout);
//select函数用于检测一组socket中是否有事件就绪,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常 。
//返回值:准备就绪的描述符数,若超时则返回0,若出错则返回-1。

1.nfds:select监视的文件句柄数,视进程中打开的文件数而定,一般设为你要监视各文件中的最大文件号加一。
2.readfds:select监视的可读文件句柄集合。
3.writefds: select监视的可写文件句柄集合。
4.exceptfds:select监视的异常文件句柄集合。
5.timeout:本次select()的超时结束时间。(见/usr/sys/select.h,可精确至百万分之一秒!)
FD_ZERO(fd_set *fdset):清空fdset与所有文件句柄的联系。
FD_SET(int fd, fd_set *fdset):建立文件句柄fd与fdset的联系。
FD_CLR(int fd, fd_set *fdset):清除文件句柄fd与fdset的联系。
FD_ISSET(int fd, fd_set *fdset):检查fdset联系的文件句柄fd是否可读写,当>0表示可读写。

存在的问题:
(1)采用轮询的方式扫描bitmap,性能会随着socket数量增多而下降。
(2)每次调用select(),需要拷贝bitmap。
(3)bitmap的大小(单个进/线程打开的socket数量)由FD_SETSIZE宏设置,默认是1024个,可以修改,但是效率将降低。

2.poll模型

int poll(struct pollfd fds[], nfds_t nfds, int timeout)//用于监视多个文件描述符的状态变化。
/*返回值:
如果函数调用成功,则返回所有事件就绪的文件描述符个数。
如果timeout时间耗尽,返回0。
如果函数调用失败,返回-1,同时错误码会被设置。
*/
struct pollfd {
int fd; /*文件描述符*/
short events; /* 等待的需要测试事件 */
short revents; /* 实际发生了的事件,也就是返回结果 */
};
1.fds:指向一个结构体数组的指针,每个数组元素都是一个struct pollfd结构,用于指定测试某个给定的fd的条件。struct pollfd包含三个成员:fd(文件描述符),events(等待的事件),revents(实际发生的事件)。
2.nfds:表示fds数组的长度。
3.timeout:表示poll函数的超时时间,单位是毫秒(ms)。如果timeout的取值为-1,则poll调用后进行阻塞等待,直到被监视的某个文件描述符上的某个事件就绪;如果timeout的取值为0,则poll调用之后进行非阻塞等待,无论被监视的文件描述符上的事件是否就绪,poll检测之后都会立即返回;如果timeout的取值为特定的时间值,则poll调用后在指定的时间内进行阻塞等待,如果被监视的文件描述符上一直没有事件就绪,则在该时间后poll进行超时返回。

存在的问题:
(1)poll的数据结构是数组,转入内核后转换成了链表。
(2)每调用一次poll拷贝一次结构体数组(select()需要拷贝两次bitmap)。
(3)监视的连接数没有1024的限制。但是使用遍历的方法,监视越多,效率越低。

3.epoll模型

int epoll_create(int size)
//创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。成功时返回epoll文件描述符,失败时返回-1。
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
//epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。第一个参数是epoll_create()的返回值,第二个参数表示动作,用三个宏来表示:EPOLL_CTL_ADD:注册新的fd到epfd中;EPOLL_CTL_MOD:修改已经注册的fd的监听事件;EPOLL_CTL_DEL:从epfd中删除一个fd;第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事。
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
//等待事件的产生,类似于select()调用。参数events用来存储内核得到的事件的集合,maxevents告知内核events的大小,timeout是超时时间。成功时返回有多少文件描述符就绪,时间到时返回0,出错时返回-1。

内容来自b站C++网络编程,从Socket基础到Epoll,百度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1668303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ssm120基于SSM框架的金鱼销售平台的开发和实现+jsp

金鱼销售平台 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于金鱼销售平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了金鱼销售平台&#xff0c;它彻底改…

电商平台商品数据的价值在哪里?如何实现批量抓取?

一、电商平台商品数据的价值探秘 在数字经济的浪潮中&#xff0c;电商平台商品数据如同一座蕴藏着无尽宝藏的矿山&#xff0c;其价值远超过我们表面的认知。今天&#xff0c;就让我们一起揭开这座矿山的神秘面纱&#xff0c;探寻其中的奥秘。 首先&#xff0c;电商平台商品数…

FPGA第2篇,FPGA与CPU GPU APU DSP NPU TPU 之间的关系与区别

简介&#xff1a;首先&#xff0c;FPGA与CPU GPU APU NPU TPU DSP这些不同类型的处理器&#xff0c;可以被统称为"处理器"或者"加速器"。它们在计算机硬件系统中承担着核心的计算和处理任务&#xff0c;可以说是系统的"大脑"和"加速引擎&qu…

AI算法-高数5-线性代数1-基本概念、向量

线性代数&#xff1a;主要研究1、张量>CV计算机视觉 2、研究张量的线性关系。 深度学习的表现之所以能够超过传统的机器学习算法离不开神经网络&#xff0c;然而神经网络最基本的数据结构就是向量和矩阵&#xff0c;神经网络的输入是向量&#xff0c;然后通过每个矩阵对向量…

自动驾驶技术与传感器数据处理

目录 自动驾驶总体架构 感知系统 决策系统 定位系统 ​计算平台​ 仿真平台​ 自动驾驶公开数据集 激光点云 点云表征方式 1) 原始点云 2) 三维点云体素化 3)深度图 4)鸟瞰图 点云检测障碍物的步骤 PCL点云库 车载毫米波雷达 车载相机 设备标定 自动驾驶…

DMA原理、传输过程及传输方式

1.DMA DMA(Direct Memory Access&#xff0c;直接存储器访问)&#xff0c;是硬件实现存储器与存储器之间或存储器与I/O设备之间直接进行数据传输的内存技术&#xff0c;它允许不同速度的硬件设备(外设到内存、内存到外设、内存到内存、外设到外设)进行沟通&#xff0c;而不需要…

MySQL相关文件的介绍

其中的pid-file/var/run/mysqld/mysqld.pid是用来定义MySQL的进程ID的信息的&#xff0c; 这个ID是操作系统分配给MySQL服务进程的唯一标识&#xff0c;使得系统管理员可以轻松识别和管理该进程。 其中的log-error/var/log/mysqld.log是MySQL的错误日志文件&#xff0c;如果有…

C++string 类的常用方法

string (构造函数) (1) default 构造长度为零字符的空字符串。 (2) copy 构造 str 的副本。 (3) substring 复制从字符位置 pos 开始并跨越 len 字符的 str 部分&#xff08;如果任一 str 太短或 len 为 string&#xff1a;&#xff1a;npos&#xff0c;则复制 str 的末尾…

Ardupilot开源代码之Rover上路 - 后续1

Ardupilot开源代码之Rover上路 - 后续1 1. 源由2. 问题汇总2.1 问题1&#xff1a;飞控选择2.2 问题2&#xff1a;飞控安装位置和固定2.3 问题3&#xff1a;各种插头、插座配套2.4 问题4&#xff1a;分电板缺陷2.5 问题5&#xff1a;电机编码器接线及正反向问题2.6 问题6&#x…

docker-compose集成elk(基于logstash+filebeat)采集java和nginx日志

1.准备compose.yml编排式文件 services: #日志信息同步logstash:container_name: logstashimage: docker.elastic.co/logstash/logstash:7.17.14 #logstash:command: logstash -f /usr/share/logstash/pipeline/logstash.confdepends_on:- elasticsearchrestart: on-failurepo…

车机HMI:驾驶员小命握在UI设计师手,九大法则必须遵循。

本文给大家列举了九大法则&#xff0c;欢迎评论点赞交流。 在车机HMI设计中&#xff0c;为了降低驾驶员的反应时间并增加驾驶安全性&#xff0c;可以遵循以下UI设计法则&#xff1a; 易读性和可识别性 确保界面上的文本和图标清晰易读&#xff0c;避免使用过小、过于复杂或模…

Crossplane 实战:构建统一的云原生控制平面

1 什么是 Crossplane Crossplane 是一个开源的 Kubernetes 扩展&#xff0c;其核心目标是将 Kubernetes 转化为一个通用的控制平面&#xff0c;使其能够管理和编排分布于 Kubernetes 集群内外的各种资源。通过扩展 Kubernetes 的功能&#xff0c;Crossplane 对 Kubernetes 集群…

GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))

1. GoF之代理模式&#xff08;静态代理动态代理(JDK动态代理CGLIB动态代理带有一步一步详细步骤)&#xff09; 文章目录 1. GoF之代理模式&#xff08;静态代理动态代理(JDK动态代理CGLIB动态代理带有一步一步详细步骤)&#xff09;每博一文案2. 代理模式的理解3. 静态代理4. 动…

[AIGC] 跳跃表是如何实现的?原理?

文章目录 什么是跳跃表查找流程&#xff1a;为什么使用跳跃表?跳跃表是怎么实现的&#xff1f; PS:跳跃表是比较常问的一种结构。 什么是跳跃表 Skip Lists: A Probabilistic Alternative to Balanced Trees 跳跃表是一种可以用来代替平衡树的数据结构。跳跃表使用概率平衡…

类和对象一(从封装开始讲述)

目录&#xff1a; 一.封装 二.封装扩展之包&#xff0c;自定义包 三.访问限定符 四.static成员 一.封装&#xff1a;封装&#xff1a;将数据和操作数据的方法进行有机结合&#xff0c;隐藏对象的属性和实现细节&#xff0c;仅对外公开接口来和对象进行 交互。面向对象…

插件:Best HTTP

一、简介 WebSocket WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性的连接&#xff0c;并进行双向数据传输。…

MATLAB 多项式

MATLAB 多项式 MATLAB将多项式表示为行向量&#xff0c;其中包含按幂次降序排列的系数。例如&#xff0c;方程P(x) X 4 7 3 - 5 9可以表示为 p [1 7 0 -5 9]; 求值多项式 polyval函数用于求一个特定值的多项式。例如&#xff0c;在 x 4 时&#xff0c;计算我们之前的多项式…

图论专题训练

leecode 547 并查集 class Solution { public:int findCircleNum(vector<vector<int>>& isConnected) {ini();int len isConnected.size();for(int i0;i<len;i){for(int j0;j<len;j)if(isConnected[i][j]){unio(i,j);}}int ans 0;for(int i0;i<len;…

【一键录音,轻松转换:用Python打造个性化音频记录工具】

在数字化时代,音频记录已成为日常学习、工作和娱乐不可或缺的一部分。想象一下,只需简单按下几个键,即可随时随地捕捉灵感,记录会议要点,或是珍藏孩子的童言稚语。本文将引领您步入Python编程的奇妙世界,展示如何借助几个强大的库,构建一个既简单又实用的音频录制及转换…

58. 【Android教程】音频录制:MediaRecord

在第 57 节我们使用 MediaPlayer 实现了一个 mp3 播放器&#xff0c;除了播放 Android 还提供了 MediaRecorder 用于录音。Android 设备基本都会有一个麦克风&#xff0c;通过 MediaRecorder 可以打开麦克风进行语音采集&#xff0c;这一节我们就来学习如何在 Android 系统上实…