网络编程学习笔记1

文章目录

  • 一、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,百度。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序的Vant Weapp组件库(WeUI组件库)

一、定义&#xff1a; 是一套开源的微信小程序UI组件库。提供了一整套UI基础组件和业务组件&#xff0c;能够快速地搭配出一套风格统一的页面 二、使用&#xff1a; &#xff08;1&#xff09;&#xff08;找到.eslintrc.js 右键&#xff0c;在内件终端打开&#xff09;打开命…

|Python新手小白中级教程|第二十八章:面向对象编程(类定义语法私有属性类的继承与多态)(4)

文章目录 前言一、类定义语法二、私有方法和私有属性1.私有属性2.私有方法 三、类“继承”1.初识继承2.使用super函数调用父类中构造的东西 四、类“多态”1.多态基础2.子类不同形态3.使用isinstance函数与多态结合判断类型 总结 前言 大家好&#xff0c;我是BoBo仔吖&#xf…

RocketMQ学习笔记(一)

一、基本概念 生产者&#xff08;Producer&#xff09;&#xff1a;也称为消息发布者&#xff0c;是RocketMQ中用来构建并传输消息到服务端的运行实体&#xff0c;举例&#xff1a;发信者主题&#xff08;Topic&#xff09;&#xff1a;Topic是RocketMQ中消息传输和存储的顶层…

【全开源】Java知识付费教育付费资源付费平台公众号小程序源码

特色功能&#xff1a; 多样化的内容呈现&#xff1a;资源付费平台小程序支持图文、音视频、直播等多种形式的内容呈现&#xff0c;为用户提供了丰富的学习体验。直播课程&#xff1a;专家或讲师可以通过小程序进行在线授课&#xff0c;与用户实时互动&#xff0c;增强了学习的…

再有人说数字孪生大屏没有用,用这8条怼回去。

数字孪生大屏之所以受到欢迎&#xff0c;主要有以下几个原因&#xff1a; 实时数据可视化 数字孪生大屏可以将实时数据以直观的可视化形式展示出来&#xff0c;让用户能够一目了然地了解数据的状态和趋势。这样可以帮助用户更好地理解和分析数据&#xff0c;及时做出决策和调…

动态规划算法练习——计数问题

题目描述 给定两个整数 a 和 b&#xff0c;求 a 和 b 之间的所有数字中 0∼9 的出现次数。 例如&#xff0c;a1024&#xff0c;b1032&#xff0c;则 a 和 b 之间共有 9 个数如下&#xff1a; 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出现 10 次&#xff0c;1 出现…

蓝桥杯-网络安全比赛(7)基础知识 HTTP、TTL、IP数据包、MSS、MTU、ARP、LLMNR、MDNS、NBNS。

1. IP中TTL值能够给我提供什么信息&#xff1f;2. IP头部中标志、13位偏移、32位源IP地址、目标IP、IP数据包格式&#xff0c;有多少字节3. IP头部中的16位标识是什么&#xff1f;4. MSS 和MTU分别有多大&#xff1f;5. 怎么获取路由IP信息&#xff1f;PING、NSLOOKUP、TRACERT…

day6Qt作业

人脸识别系统 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> #include<opencv2/face.hpp> #include <vector> #include <map> #include <QMessag…

创建一个react项目(router,store,axios,antd)最后有项目地址

第一步&#xff1a;使用cra脚手架 创建项目 文档地址&#xff1a;Create React App 中文文档 npx create-react-app 你的项目名称 第二步&#xff1a;整理项目结构和删除多余代码 目标效果图&#xff1a; 在src目录下分别新建apis,assets,components,pages,router,store,ut…

重学JavaScript核心知识点(二)—— 详解Js中的模块化

详解Js中的模块化 1. 模块化的背景2. 来看一个例子3. 优雅的做法 —— 创建模块对象4. 模块与类&#xff08;class&#xff09;5. 合并模块6. 动态加载模块 1. 模块化的背景 JavaScript 在诞生之初是体积很小的&#xff0c;早期&#xff0c;它们大多被用来执行独立的脚本任务&…

C++初学者,使用命令行编绎C文件

今天在家里&#xff0c;闲来无事。又开始学习制作Helloworld! VStudio 版本众多&#xff0c;用哪个好呢&#xff0c;真是不好选择。今天就使用网上的大神&#xff1a;theoractice&#xff0c;制造的版本来学习C&#xff0c;我喜欢2013这个版本&#xff0c;真是太好用了。不但C…

Qt自定义控件--提升为

为什么要自定义控件 1&#xff0c;有复合小控件需要组合为一个整体控件时&#xff1b; 2&#xff0c;一个复合控件需要重复使用时&#xff1b; 实现 自定义控件文件 新增三个文件 关联不同组的控件 关联之前的准备工作 1&#xff0c;在主控件选择和子控件所有控件所在控件…

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

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

第十二届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 相乘试题 B: 直线试题 C : \mathrm{C}: C: 货物摆放试题 D: 路径试题 E: 回路计数试题 F : \mathrm{F}: F: 最少砝码试题 G: 左孩子右兄弟试题 H : \mathrm{H}: H: 异或数列试题 I \mathbf{I} I 双向排序试题 J : \mathrm{J}: J: 分…

如何快速展示专业:掌握类的基本概念-类/方法/关键字/变量/数据类型/注释

在李笑来的《财富自由之路》中提到一种初学者快速入门的学习方法&#xff1a;快速掌握最小必要知识。 关于Java的类&#xff0c;最少必要知识就是本文提到的基本概念&#xff0c;掌握了这些基本概念&#xff0c;就对类有了基本的了解&#xff0c;为后续的深入学习和沟通奠定了基…

Go编程语言的调试器Delve | Goland远程连接Linux开发调试(go远程开发)

文章目录 Go编程语言的调试器一、什么是Delve二、delve 安装安装报错cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in $PATH解决 三、delve命令行使用delve 常见的调试模式常用调试方法todo调试程序代码与动态库加载程序运行…

真要这么卷?某国产大模型定价下调90%,百万 tokens 只需 1 元!

就在刚刚&#xff0c;国内明星AI公司——智谱AI官宣重磅炸弹&#xff1a; 将能力对标GPT3.5-Turbo的GLM-3的大模型API调用价格最高下调90%&#xff0c;价格仅为原来的十分之一&#xff01; 废话不多说&#xff0c;直接上图&#xff1a; 官网地址&#xff1a;https://open.big…

【SRC实战】前端脱敏信息泄露

挖个洞先 https://mp.weixin.qq.com/s/xnCQQCAneT21vYH8Q3OCpw “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合 ” 01 — 漏洞证明 一、前端脱敏&#xff0c;请求包泄露明文 “ 前端脱敏处理&#xff0c;请求包是否存在泄露&#xff1f; ” 1、获取验…

公有云Linux模拟UDP端口并抓包

目录 写在前面操作步骤服务端开启UDP端口并监听客户端连接Wireshark抓包查看 写在前面 关于具体的操作&#xff0c;请参考我的上一篇文章 公有云Linux模拟TCP三次挥手与四次握手&#xff08;Wireshark抓包验证版&#xff09; 在本文&#xff0c;仅介绍与上一篇不同的地方。 操…

STL中的优先级队列

目录 1.引言 2.简介 3.基本操作 4.实现原理 5.自定义优先级比较 6.相关题目 7.能特点 8.总结 1.引言 在C标准库中&#xff0c;优先级队列是一种非常有用的数据结构&#xff0c;它允许我们根据元素的优先级来对其进行排序和访问。这种数据结构在多种应用场景中都发挥着重…