网络编程学习笔记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,百度。

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

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

相关文章

linq常用方法

1.Where - 用于筛选满足特定条件的元素。 var query list.Where(x > x > 10); 2.Select - 用于投影每个元素到一个新的形式。这通常用于转换数据的形状。 var query list.Select(x > x * x); 3.OrderBy / OrderByDescending - 用于对元素进行升序或降序排序。 var…

1.5. 离散时间鞅-平方可积鞅

平方可积鞅 平方可积鞅1. BDG极大值不等式1.1. 有限时间BDG不等式1.2. 无限时间的BDG不等式2. 平方可积鞅的收敛性2.1. { A ∞ < ∞ } \left\{A_{\infty}<\infty\right\}

Servlet讲解

Servlet生命周期 我们只需要继承Servlet接口&#xff0c;查看方法即可看出Servlet的生命周期 import java.io.IOException;import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest…

对数据进行标准化和归一化

数据的形式&#xff1a;保存在CSV中&#xff0c;第一列为姓名&#xff0c;第二列之后为特征。 标准化 输入文件的路径&#xff0c;设置保存转化后的文件路径 import pandas as pd from sklearn.preprocessing import StandardScaler# 读取CSV文件 data pd.read_csv(rC:\User…

信息系统项目管理师(高项)--学习笔记【第7章:立项管理】完善中~~~

目录 第7章 立项管理7.1 项目建议与立项申请7.2 项目可行性研究7.2.1可行性研究的内容7.2.2初步可行性研究7.2.3详细可行性研究 7.3 项目评估与决策 第7章 立项管理 7.1 项目建议与立项申请 7.2 项目可行性研究 7.2.1可行性研究的内容 7.2.2初步可行性研究 7.2.3详细可行性…

AMD CPU Nvidia GPU Ubuntu 黑屏网络故障案例分享

&#xff08;首发地址&#xff1a;学习日记 https://www.learndiary.com/2024/05/grub-xorg/&#xff09; 朋友们&#xff0c;大家好&#xff01;我是来自淘宝网学习日记小店的 Linux 服务者 learndiary。今天&#xff0c;我将和大家分享一个关于AMD Ryzen 9 7950X3D 16核 CPU …

GPT 大型语言模型可视化教程

网址&#xff1a; LLM Visualization 简介 欢迎来到 GPT 大型语言模型演练&#xff01;在这里&#xff0c;我们将探索只有 85,000 个参数的 nano-gpt 模型。 它的目标很简单&#xff1a;取一个由六个字母组成的序列&#xff1a; C B A B B C 并按字母顺序排列&#xff0c;即…

Jboss 反序列化 CVE-2017-12149

一、漏洞简介 JBoss是一个管理EJB的容器和服务器&#xff0c;支持EJB 1.1、EJB 2.0和EJB3的规范。在/invoker/readonly路径下&#xff0c;攻击者可以构造序列化代码传入服务器进行反序列化,由于没有对反序列化操作进行任何检测&#xff0c;导致攻击者可以执行任意代码。 而jbo…

TCP(TCP客户端、服务器如何通信)

一、TCP介绍 TCP的特点&#xff1a; 面向连接的协议&#xff1a;TCP是一种可靠的、面向连接的协议&#xff0c;在通信之前需要建立连接&#xff0c;以确保数据的可靠传输。这意味着在传输数据之前&#xff0c;发送方和接收方之间需要建立一条可靠的连接通道。流式协议&#x…

Linux实验 系统管理(三)

实验目的&#xff1a; 了解Linux系统下的进程&#xff1b;掌握一类守护进程——计划任务的管理&#xff1b;掌握进程管理的常用命令&#xff1b;掌握进程的前台与后台管理&#xff1b;了解Linux系统的运行级别&#xff1b;掌握系统服务管理的常用命令。 实验内容&#xff1a; …

在线教育系统先进单位事迹,教育行业公众号线上推广如何有效果?

教育行业的市场前景十分大&#xff0c;相对的来说行业之间的竞争也是十分激烈的&#xff0c;培训机构想要在激烈竞争中脱颖而出就需要进行推广&#xff0c;很多机构都是有自己的公众号&#xff0c;那教育行业公众号线上推广如何有效果&#xff1f; 微信公众号可以做做教程&…

040——移植数据库sqlite3到i.mx6ull

目录 一、下载 二、移植数据库 三、测试sqlite3 一、下载 SQLite Download Page 暂时先下载最新版的试试&#xff0c;我们以前其实在ubuntu上直接使用过 嵌入式数据库sqlite3_常见的嵌入式数据库-CSDN博客 当时我把常用的操作和怎么使用记录下来了 现在把他移植到开发板…

GitFlow流程

分支角色 主分支&#xff08;master/main&#xff09;: 代表最新的正式发布版本&#xff0c;应始终保持稳定&#xff0c;可以直接用于生产环境。只有在完成一个新版本的开发并经过测试后&#xff0c;才将发布分支合并到主分支。 开发分支&#xff08;develop&#xff09;: 包含…

下水道井盖多分类检测定位

下水道井盖识别&#xff0c;多分类&#xff0c;使用yolov5训练&#xff0c;采用一部分开源数据集和自建数据集。python pytorch opencv 深度学习#人工智能#深度学习#目标检测

Python 的 QT 界面中记住上次的设置

要在 Python 的 QT 界面中记住上次的设置&#xff0c;可以使用一些持久化存储的方法&#xff0c;比如将设置信息保存到文件中或使用数据库。 以下是一个简单的示例&#xff0c;展示了如何将设置信息保存到文件中&#xff1a; import jsondef save_settings(settings):with op…

【Python项目】基于大数据的【电影市场预测分析】

技术简介&#xff1a;使用Python技术、B/S架构、MYSQL数据库等实现。 系统简介&#xff1a;系统都需要简单的安全登陆检查&#xff0c;在登陆成功之后要进行在映电影的分析、票房分析、电影数据等功能相关性的数据统计&#xff0c;为了使用方便这些统计型的数据使用图表来进行表…

Kafka 环境搭建和使用之单机模式详细教程

上一篇:Kakfa 简介及相关组件介绍 下一篇:Kafka 环境搭建之伪分布式集群详细教程 Kafka 环境搭建 Kafka的环境搭建可以根据不同的需求和场景采取不同的模式,主要包括以下几种: 单机模式(Standalone Mode): 在这种模式下,Kafka、Zookeeper 以及生产者和消费者都在同一…

【基于element ui的color选择器】基于element ui的color选择器

技术版本如下&#xff1a; vue 2.6.14 less 3.13.1 element-ui 2.15.6 less-loader 5.0.0需求&#xff1a; 支持RGB、HEX编码、支持吸管吸取颜色、颜色选择器、颜色模板、透明度、色板、线性渐变颜色 效果图&#xff1a; 1.引入选择器的color-all文件 <template><…

web前端之纯CSS实现简单酷炫的照片墙效果、排除元素的伪类、scale

MENU 效果htmlstylescale:not() 效果 html <div class"container"><div class"box"><img src"../../image/1_.jpg"></div><div class"box"><img src"../../image/2_.jpg"></div>…