【网络编程基础(一)】网络基础和SOCKET

这里写目录标题

  • 1、网络三要素
  • 2、IPV4和IPV6区别
  • 3、网络交互
    • 3.1、交互模型图
    • 3.2、基础通信协议
    • 3.3、OSI参考模型与TCP/IP参考模型对应关系
  • 4、SOCKET网络套接字
    • 4.1、SOCKET分类
    • 4.2、基于流式套接字的编程流程
    • 4.3、网络通信雏形
    • 4.4、socket函数
      • 4.4.1、socket函数示例
    • 4.5、bind函数
      • 4.5.1、bing函数示例
    • 4.6、listen函数
      • 4.6.1、listen函数示例
    • 4.7、accept函数
    • 4.8、connect函数
  • 5、客户端服务器通信示例
    • 5.1、客户端示例
    • 5.2、服务器示例
    • 5.3、网络通信示图

1、网络三要素

  • ip地址:在网络确定另一个交互数据的计算机位置
  • 端口号:确定计算机中某一个应用程序 10000以下不适用(系统使用,如热点,蓝牙等)
  • 通信协议:通信规则

2、IPV4和IPV6区别

IPv4和IPv6是互联网协议(Internet Protocol)的个版本,它们有以下几点区别:

  1. 地址长度:IPv4使用32位地址,而IPv6使用128位地址。
  2. 地址表示:IPv4地址使用点分十进制表示,例如192.168.0.1。而IPv6地址使用冒号分隔的八组四位十六进制数表示,(数字+字母 大小写排列组合)
    例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334。
  3. 地址数量:IPv4最多可以提供约42亿个地址,而IPv6可以提供约340万亿亿亿亿(3.4×10^38)个地址。
  4. 自动配置:IPv6支持自动配置,设备可以根据网络环境自动获取IPv6地址和其他网络配置信息。而IPv4需要手动配置或使用DHCP协议进行地址分配。
  5. 安全性:IPv6在设计时考虑了更强的安全性,支持IPsec(Internet Protocol Security)协议,可以提供端到端的数据加密和认证功能。而IPv4需要额外的安全协议来实现类似的功能。
  6. 兼容性:由于IPv6与IPv4有很大的差异,为了实现平滑过渡,IPv6引入了双协议栈机制,可以同时支持IPv4和IPv6。这样可以保证在IPv6逐渐普及的过程中,与IPv4兼容的设备仍然可以正常访问互联网。

3、网络交互

3.1、交互模型图

在这里插入图片描述

3.2、基础通信协议

在这里插入图片描述
** TCP和UDP区别:**

TCP:更加安全,效率低一些
UDP:效率更高,安全性不足

3.3、OSI参考模型与TCP/IP参考模型对应关系

在这里插入图片描述

应用层 :HTTP,FTP,SNMP等
表示层 :ASCII、PICT、TIFF、JPEG、 MIDI、MPEG
会话层 :RPC、SQL、NFS 、X WINDOWS、ASP
传输层 :TCP、UDP=
网络层 :IP、IPX、APPLETALK、ICMP
数据链路层: 802.2、802.3ATM
物理层

4、SOCKET网络套接字

4.1、SOCKET分类

  • 流式套接字(SOCK_STREAM)
    流式的套接字可以提供可靠的、面向连接的通讯流。它使用了TCP协议。TCP 保证了数据传输的正确性和顺序性。
  • 数据报套接字(SOCK_DGRAM)
    数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错。使用数据报协议UDP协议。
  • 原始套接字。
    原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。

4.2、基于流式套接字的编程流程

在这里插入图片描述

4.3、网络通信雏形

在这里插入图片描述

注:socket在IPC技术之一:不同电脑中的两个进程间的通信

4.4、socket函数

在这里插入图片描述

  • 参数1:协议族 (IPV4/IPV6)
  • 参数2:网络类型(TCP/UDP)
  • 参数3:一般为0
  • 返回值:返回新建的网络通道描述符
  • 函数功能:网络初始化,验证当前系统是否可以使用网络

协议族
在这里插入图片描述
网络类型
在这里插入图片描述

4.4.1、socket函数示例

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>]
#include <stdio.h>
using namespace std;
int main()
{//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd<0){perror("socket error");}return 0;
}

4.5、bind函数

在这里插入图片描述
参数1:网络通道描述符(socket函数返回值)
参数2:绑定的IP地址和端口号的结构体
参数3:绑定的IP地址和端口号的结构体的大小
函数功能:绑定端口号和IP地址
返回值:成功返回0,失败返回-1

4.5.1、bing函数示例

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>]
#include <netinet/in.h>
#include <stdio.h>
using namespace std;
int main()
{int len;struct sockaddr_in addr;//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd<0){perror("socket error");}else{cout << "服务器网络初始化 socketfd " << socketfd << endl;//协议族addr.sin_family = AF_INET;//绑定的是服务器自己的IP地址,INADDR_ANY通过系统获取可用的网络IPaddr.sin_addr.s_addr = INADDR_ANY;//绑定服务器自己的端口号addr.sin_port = htons(10001);len = sizeof(addr);//绑定端口号和IP地址//参数2:需要强制转换类型if (bind(socketfd, (struct sockaddr*)&addr, len) == -1){perror("bind error");return 0;}}return 0;
}

4.6、listen函数

在这里插入图片描述
参数1:网络通道描述符(socket函数返回值)
参数2:客户端数量
函数功能:监听网络是否有数据过来
返回值:成功返回0,失败返回-1

4.6.1、listen函数示例

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>]
#include <netinet/in.h>
#include <stdio.h>
using namespace std;
int main()
{int len;struct sockaddr_in addr;//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd<0){perror("socket error");return 0;}else{cout << "服务器网络初始化 socketfd " << socketfd << endl;//协议族addr.sin_family = AF_INET;//绑定的是服务器自己的IP地址,INADDR_ANY通过系统获取可用的网络IPaddr.sin_addr.s_addr = INADDR_ANY;//绑定服务器自己的端口号addr.sin_port = htons(10001);len = sizeof(addr);//绑定端口号和IP地址//参数2:需要强制转换类型if (bind(socketfd, (struct sockaddr*)&addr, len) == -1){perror("bind error");return 0;}//监听网络是否有数据过来if (listen(socketfd, 10) == -1)//10为客户端数量{perror("listen error");return 0;}cout << "服务器网络搭建成功" << endl;}return 0;
}

4.7、accept函数

在这里插入图片描述
参数1:网络通道描述符(socket函数返回值)
参数2:在上一步操作中已经完成,所以为NULL(绑定IP地址和端口号)
参数3:同上
返回值是表示已连接的套接字描述符

accept 函数由 TCP 服务器调用,用于从已完成连接队列队头返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。
参数sockfdsockfd是socket系统调用返回的服务器端socket描述符addr用来返回已连接的对端(客户端)的协议地址

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>]
#include <netinet/in.h>
#include <stdio.h>
using namespace std;
int main()
{int len=0;int acceptfd=0;struct sockaddr_in addr;//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd<0){perror("socket error");return 0;}else{cout << "服务器网络初始化 socketfd " << socketfd << endl;//协议族addr.sin_family = AF_INET;//绑定的是服务器自己的IP地址,INADDR_ANY通过系统获取可用的网络IPaddr.sin_addr.s_addr = INADDR_ANY;//绑定服务器自己的端口号addr.sin_port = htons(10001);len = sizeof(addr);//绑定端口号和IP地址//参数2:需要强制转换类型if (bind(socketfd, (struct sockaddr*)&addr, len) == -1){perror("bind error");return 0;}//监听网络是否有数据过来if (listen(socketfd, 10) == -1)//10为客户端数量{perror("listen error");return 0;}cout << "服务器网络搭建成功" << endl;while (1){//等待客户端连接   acceptfd 代表已经连接成功的客户端 acceptfd=accept(socketfd,NULL,NULL);//阻塞函数  cout << "客户端连接成功 acceptfd =" << acceptfd << endl;}}return 0;
}

4.8、connect函数

在这里插入图片描述
参数1:网络通道描述符(socket函数返回值)
参数2:绑定的IP地址和端口号的结构体
参数3:绑定的IP地址和端口号的结构体的大小

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>]
#include <netinet/in.h>
#include <stdio.h>
using namespace std;
int main()
{int len=0;struct sockaddr_in addr;//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd<0){perror("socket error");return 0;}else{cout << "服务器网络初始化 socketfd " << socketfd << endl;addr.sin_family = AF_INET;//绑定服务器IP地址   表示客户端主动查找服务器IP连接addr.sin_addr.s_addr = inet_addr("192.168.16.229");//绑定服务器自己的端口号addr.sin_port = htons(10001);len = sizeof(addr);if(connect(socketfd,(struct sockaddr*)&addr,len)==-1){perror("socket error");return 0;}}return 0;
}

5、客户端服务器通信示例

5.1、客户端示例

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
using namespace std;
int main()
{int res = 0;char buf[100] = { 0 };int len = 0;struct sockaddr_in addr;//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET, SOCK_STREAM,0);if (socketfd < 0){perror("socket error");return 0;}else{cout << "服务器网络初始化 socketfd " << socketfd << endl;addr.sin_family = AF_INET;//绑定服务器IP地址   表示客户端主动查找服务器IP连接addr.sin_addr.s_addr = inet_addr("192.168.13.129");//绑定服务器自己的端口号addr.sin_port = htons(10001);len = sizeof(addr);if (connect(socketfd, (struct sockaddr*)&addr, len) == -1){perror("socket error");return 0;}while (1){cin >> buf;res = write(socketfd, buf, sizeof(buf));cout << "res= " << res << endl;}}return 0;
}

5.2、服务器示例

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
using namespace std;
int main()
{char buf[100]={0};pid_t pid =0;int res=0;int len=0;int acceptfd=0;struct sockaddr_in addr;//网络初始化,验证当前系统是否可以使用网络int socketfd = socket(AF_INET,SOCK_STREAM,0);if(socketfd<0){perror("socket error");return 0;}else{cout << "服务器网络初始化 socketfd " << socketfd << endl;//协议族addr.sin_family = AF_INET;//绑定的是服务器自己的IP地址,INADDR_ANY通过系统获取可用的网络IPaddr.sin_addr.s_addr = INADDR_ANY;//绑定服务器自己的端口号addr.sin_port = htons(10001);len = sizeof(addr);//绑定端口号和IP地址//参数2:需要强制转换类型if (bind(socketfd, (struct sockaddr*)&addr, len) == -1){perror("bind error");return 0;}//监听网络是否有数据过来if (listen(socketfd, 10) == -1)//10为客户端数量{perror("listen error");return 0;}cout << "服务器网络搭建成功" << endl;while (1){//等待客户端连接   acceptfd 代表已经连接成功的客户端 acceptfd=accept(socketfd,NULL,NULL);//阻塞函数  cout << "客户端连接成功 acceptfd =" << acceptfd << endl;pid =fork();if(pid ==0){while(1){res= read(acceptfd,buf,sizeof(buf));cout<<"服务器res="<<res<<"buf = "<<buf<<endl;}}}}return 0;
}

5.3、网络通信示图

在这里插入图片描述

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

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

相关文章

idea 的基本配置

一、安装目录介绍 其中&#xff1a;bin 目录下&#xff1a; 二、配置信息目录结构 这是 IDEA 的各种配置的保存目录。这个设置目录有一个特性&#xff0c;就是你删除掉整个目录之后&#xff0c;重新启动 IntelliJ IDEA 会再自动帮你生成一个全新的默认配置&#xff0c;所以很多…

串的模式匹配(简单匹配、KMP以及手工算next/nextval)

简单模式匹配 思路&#xff1a;主串和字串进行匹配&#xff0c;设置i、j、k&#xff08;主串、子串和匹配起始下标&#xff09;主串和子串一开始都是从第一个位置&#xff08;k i&#xff09;&#xff0c;若当前主串和子串匹配成功那么i、j&#xff0c;若匹配不成功k、j 1&am…

24计算机考研调剂 | 宁波大学

北京信息科技大学接收调剂研究生 2024中国科学院宁波材料所与高校联合培养硕士研究生项目介绍 考研调剂招生信息 中国科学院宁波材料技术与工程研究所&#xff08;简称“宁波材料所”&#xff09;成立于2004年4月&#xff0c;是由中国科学院、浙江省人民政府、宁波市人民政府三…

算法第二十九天-森林中的兔子

森林中的兔子 题目要求 解题思路 重点&#xff1a;某个兔子回答x的时候&#xff0c;那么数组中最多循序x1个同花色的兔子同时回答x 我们可以通过举例子得出一下的规律&#xff1a; 我们统计数组中所有回答x的兔子的数量n&#xff1a; 若n%(x1)0&#xff0c;说明我们此时只需…

每日一题——LeetCode1694.重新格式化电话号码

方法一 模拟&#xff1a; 首先去除number里面的破折号和空格&#xff0c;取出纯数字组成的字符串str。 对于str每三个数分成一组&#xff0c;加一个破折号&#xff0c;当str的长度小于等于4时再分情况讨论&#xff0c;如果等于4就分为22形式&#xff0c;如果小于4&#xff0c…

哥斯拉流量webshell分析-->ASP/PHP

哥斯拉流量webshell分析 哥斯拉是继菜刀、蚁剑、冰蝎之后的又一个webshell利器&#xff0c;这里就不过多介绍了。 哥斯拉GitHub地址&#xff1a;https://github.com/BeichenDream/Godzilla 很多一线师傅不太了解其中的加解密手法&#xff0c;无法进行解密&#xff0c;这篇文章…

zabbix配置

1 下载zabbix 1 配置yum源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release- 5.0-1.el7.noarch.rpm yum clean all yum makecache fast 完成后会出现zabbix.repo文件 2安装zabbix服务 yum -y install zabbix-server-mysql zabbix-web-mysql z…

OpenHarmony—自适应布局

针对常见的开发场景&#xff0c;方舟开发框架提炼了七种自适应布局能力&#xff0c;这些布局可以独立使用&#xff0c;也可多种布局叠加使用。 下面我们依次介绍这几种自适应布局能力。 拉伸能力 拉伸能力是指容器组件尺寸发生变化时&#xff0c;增加或减小的空间全部分配给容…

继承 ResponseEntityExceptionHandler

目录 作用概述 示例-HttpRequestMethodNotSupportedException 示例-自定义异常处理 总示例 使用了ResponseEntityExceptionHandler后&#xff0c;为什么发生了异常后返回体为空 方法执行顺序 作用概述 这是一个方便的基类&#xff0c;用于希望通过 ExceptionHandler 方法…

【C语言_字符函数和字符串函数_复习篇】

目录 一、字符函数 1.1 字符分类函数 1.2 字符转换函数 二、字符串函数 2.1 strlen函数 2.1.1 strlen函数的使用 2.1.2 strlen函数的模拟实现 2.2 strcpy函数 2.2.1 strcpy函数的使用 2.2.2 strcpy函数的模拟实现 2.3 strcat函数 2.3.1 strcat函数的使用 2.3.2 strcat函数的…

基于深度学习LSTM+NLP情感分析电影数据爬虫可视化分析推荐系统(深度学习LSTM+机器学习双推荐算法+scrapy爬虫+NLP情感分析+数据分析可视化)

文章目录 基于深度学习LSTMNLP情感分析电影数据爬虫可视化分析推荐系统&#xff08;深度学习LSTM机器学习双推荐算法scrapy爬虫NLP情感分析数据分析可视化&#xff09;项目概述深度学习长短时记忆网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;机器学习协…

ISIS默认层级实验简述

ISIS被划分为三个层级&#xff1a;Level 1、Level 2和Level 1-2。 默认情况下&#xff0c;ISIS路由器属于level 1-2,是指同时支持Level 1和Level 2的路由器。路由器既可以在同一个自治系统内部进行路由选择&#xff0c;也可以将路由信息传递到其他自治系统。 实验拓扑图&#…

C# 打开文件对话框(OpenFileDialog)

OpenFileDialog&#xff1a;可以打开指定后缀名的文件&#xff0c;既能单个打开文件也能批量打开文件 /// <summary>/// 批量打开文档/// 引用&#xff1a;System.Window.Fomrs.OpenFileDialog/// </summary>public void OpenFile(){OpenFileDialog dialog new Op…

execl/python读取数据库( Access、MySQL)

目录 一 、读取access数据库 &#xff08;一&#xff09;execl读取数据库 1.搜索ODBC&#xff08;注意自己的execl是64位还是32位&#xff09; 2.安装数据源的驱动程序 3.打开execl 4. 补充&#xff1a;选择数据源时&#xff0c;也可以直接在execl中选择数据源 &#xff…

如何实现队列和栈的转化(c语言)

文章目录 一.什么是栈二.什么是队列三.怎么把栈变成队列&#xff08;力扣&#xff09;四.怎么把队列变成栈&#xff08;力扣&#xff09;总结 一.什么是栈 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表。限定权在表尾进行插入和删除操作的线性…

Git——本地使用详解

目录 Git1、开始版本控制1.1、初始化Repository1.2、使目录脱离Git控制 2、把文件交给Git管控2.1、创建文件后交给Git2.2、git add之后再次修改文件2.3、git add "--all"与"."参数区别2.4、把暂存区的内容提交到存储库里存档 3、工作区、暂存区与存储库3.1…

生成式AI竞赛:开源还是闭源,谁将主宰未来?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

C语言基础-内联函数在头文件中的定义

文章目录 前言inline关键字优点缺点使用注意 头文件中定义函数内联函数在头文件中的定义总结 前言 在软件开发过程中&#xff0c;大家可能很少会遇到inline关键字&#xff0c;也可能很少见到头文件中定义函数体。没有用过不代表不能了解&#xff0c;菜就多练&#xff01;哈哈哈…

从零开始搭建游戏服务器 第三节 Protobuf的引入并使用

目录 上一节问题答案公布本节内容Protobuf介绍正文在build.gradle引入protobuf编写proto并生成使用生成的proto来进行数据传输 总结 上一节问题答案公布 上一节我们创建了ConnectActor&#xff0c;并且使用ConnectActorManager和connectId将其管理起来。 并且我们在收到客户端…

【Twinmotion】Twinmotion导入UE5

步骤 1. 在虚幻商城中安装“Datasmith Twinmotion导入器插件” 安装“面向虚幻引擎的Twinmotion内容” 2. 打开虚幻引擎&#xff0c;在插件中搜索“twinmotion”&#xff0c;勾选如下两个插件&#xff0c;然后重启虚幻引擎 3. 打开Twinmotion&#xff0c;随便添加一个物体 导出…