【网络编程基础(一)】网络基础和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://www.mzph.cn/news/750769.shtml

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

相关文章

蓝桥杯小白赛第 7 场 3.奇偶排序(sort排序 + 双数组)

思路&#xff1a;在第一次看到这道题的时候我第一想法是用冒泡&#xff0c;但好像我的水平还不允许我写出来。我又读了遍题目发现它的数据很小&#xff0c;我就寻思着把它分成奇偶两部分。应该怎么分呢&#xff1f; 当然在读入的时候把这个问题解决就最好了。正好它的数据范围…

【相关问题解答1】bert中文文本摘要代码:import时无法找到包时,几个潜在的原因和解决方法

【相关问题解答1】bert中文文本摘要代码 写在最前面问题1问题描述一些建议import时无法找到包时&#xff0c;几个潜在的原因和解决方法1. 模块或包的命名冲突解决方法&#xff1a; 2. 错误的导入路径解决方法&#xff1a; 3. 第三方库的使用错误解决方法&#xff1a; 4. 包未正…

C++算法学习心得八.动态规划算法(4)

1.零钱兑换&#xff08;322题&#xff09; 题目描述&#xff1a; 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 你可以认为每种硬币的数量是无限的。…

CSDN学习笔记总索引(2024)——我的创作纪念日(1024)

2021-05-21至2024-03-17笔记&#xff0c;收集并展示浏览阅读点赞收藏等数据。 (本笔记适合初通Python&#xff0c;对其基本数据类型字符串str、列表list、元组tuple、字典dict初步了解&#xff0c;认识Linux获取Html文本指令crul、会使正则模块re的coder翻阅) 【学习的细节是欢…

【C++】每日一题 105 从前序和中序序列构造二叉树

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 #include <iostream> #include <vector> #include <unordered_map>struct TreeN…

华为机试真题练习汇总(41~50)

华为机试真题练习汇总&#xff08;41~50&#xff09; 华为机试真题练习汇总&#xff08;41~50&#xff09;* HJ41 称砝码* HJ42 学英语* HJ43 迷宫问题* HJ44 SudokuHJ45 名字的漂亮度HJ46 截取字符串HJ48 从单向链表中删除指定值的节点** HJ50 四则运算 华为机试真题练习汇总&…

VS2019加QT5.14中Please assign a Qt installation in ‘Qt Project Settings‘.问题的解决

第一篇&#xff1a; 原文链接&#xff1a;https://blog.csdn.net/aoxuestudy/article/details/124312629 error:There’ no Qt version assigned to project mdi.vcxproj for configuration release/x64.Please assign a Qt installation in “Qt Project Settings”. 一、分…

修改Docker 默认存储路径,镜像容器移动到新路径

修改Docker 默认存储路径&#xff0c;镜像容器移动到新路径 查看当前docker的默认存储目录1 停止docker服务2 数据迁移3 配置目录4 重启docker服务5 查看 主机 ubuntu20.04 查看当前docker的默认存储目录 docker info显示 Docker Root Dir: /var/lib/docker1 停止docker服务…

船舶工控机维修 日本古野FURUNO工控机主板 船用雷达配件

古野海洋雷达是迄今为止为休闲划船者打造的最佳碰撞规避系统。雷达系统让您“看到”黑暗、薄雾和暴风雨天气条件。当仅在大型船舶上使用时&#xff0c;雷达设备现在结构紧凑&#xff0c;吸引很少的电能&#xff0c;并且尺寸适合小至 18 英尺的船只。雷达与带有最新数字图表的 A…

PPO:推动语言模型对齐的关键技术

PPO&#xff1a;推动语言模型对齐的关键技术 最新的人工智能研究揭示&#xff0c;通过人类反馈的强化学习(RLHF)是训练大型语言模型(LLMs)的关键技术。尽管某些AI从业者因熟悉监督学习而回避使用RL&#xff0c;但RL技术其实并不复杂&#xff0c;并能显著提升LLM的性能。本文深…

Linux基础开发工具之yum与vim

1. Linux软件包管理器——yum 1.1 什么是软件包&#xff1f; 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, …

Nginx离线安装(保姆级教程)

1、下载与安装gcc-c环境 获取rpm包的方式很多&#xff0c;在这里推荐使用yum工具获取&#xff0c;因为手动从官网下载&#xff0c;手动执行rpm -Uvh *.rpm --nodeps --force命令进行安装&#xff0c;可能会缺少某个依赖&#xff0c;我们也不确定到底需要哪些依赖。 因此需要准…

基于Linux内核的socket编程(TCP)的C语言示例

原文地址&#xff1a;https://www.geeksforgeeks.org/socket-programming-cc/ 服务端&#xff1a; #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <unistd.h>#…

【Conda】详细讲解

Conda 1. 前言2. 关键特点3. Conda命令 1. 前言 Conda是一个流行的包管理器和环境管理器&#xff0c;主要用于Python编程语言&#xff0c;但也可以用来安装、运行和更新包和环境中的任何语言&#xff0c;如R、Ruby、Lua、Scala、Java等。Conda主要是为了方便数据科学、机器学习…

Python之Web开发中级教程----搭建Web框架二

Python之Web开发中级教程----搭建Web框架二 搭建虚拟环境 虚拟环境的作用 虚拟环境可以搭建独立的python运行环境, 使得单个项目的运行环境与其它项目互不影响. 搭建虚拟环境 &#xff08;1&#xff09;安装 sudo pip install virtualenv sudo pip install virtualenvwra…

17个工作必备的Python自动化代码分享(上篇)

引言 Python是一种流行的编程语言&#xff0c;以其简单性和可读性而闻名。因其能够提供大量的库和模块&#xff0c;它成为了自动化各种任务的绝佳选择。让我们进入自动化的世界&#xff0c;探索17个可以简化工作并节省时间精力的Python脚本。 目录&#xff08;上篇&#xff0…

在线答疑系统|基于springboot框架+ Mysql+Java+Tomcat的在线答疑系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 学生功能模块 教师后台功能模块 管理员功能模块 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研…

赚钱的秘密:如何利用资源为你谋利

想要赚钱&#xff0c;首先我们要知道钱到底代表着什么。金钱的真正意义是什么&#xff1f;我觉得&#xff0c;只有先明白任何事情背后的本质&#xff0c;你才能真正明白如何做好这件事。钱也是一样的&#xff0c;只有当你真正明白钱的真正含义时&#xff0c;你才能真正把钱挑出…

Java技术学习|感想1

从韩顺平老师的java基础开始&#xff0c;到国哥的javaweb。之后杨博超老师的spring6。Springmvc&#xff08;中间入门了Vue&#xff0c;了解了thyemeleaf&#xff09;&#xff0c;mybatis。怎么说呢&#xff0c;到现在&#xff0c;学习springboot&#xff0c;学着学着要用到red…

SpringBoot中引入了springcloud-gateway,路由不生效为什么?

今天闲来无事&#xff0c;想看看springcloud-gateway的&#xff0c;于是自开始搭建gateway但是&#xff0c;搭建完成后想验证&#xff0c;发现有问题总会报404&#xff0c;接下来详细说下操作过程&#xff0c; 1.首先创建2个springBoot的工程。一个作为gateway 一个可以作为路…