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

news2024/12/26 10:49:19

这里写目录标题

  • 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通过系统获取可用的网络IP
		addr.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通过系统获取可用的网络IP
		addr.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通过系统获取可用的网络IP
		addr.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通过系统获取可用的网络IP
		addr.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.coloradmin.cn/o/1523444.html

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

相关文章

小红书图片怎么提取?小红书图片提取原图方法!

说到小红书&#xff0c;不少女性群体都知道这个&#xff0c;他的价值很高而且变现对于大多数做自媒体的小伙伴来说&#xff0c;也是不错的选择&#xff01; 小红书对于普通大众还是互联网创作者来说&#xff0c;都太实用了&#xff0c;唯一的缺点可能就是当我们需要存储他的图…

计算机设计大赛 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

基于springboot+vue实现药品信息管理系统项目【项目源码+论文说明】

基于springbootvue实现药品信息管理系统演示 摘要 本文介绍了一种基于SpringBoot的药品信息管理系统的设计与实现。该系统旨在提高药品管理的效率和准确性&#xff0c;包括药品信息的录入、修改、查询和删除、药品入库、出库等功能。该系统采用了SpringBoot框架、MySQL数据库、…

如何快速搭建物联网工业云平台

随着物联网技术的快速发展&#xff0c;物联网工业云平台已经成为推动工业领域数字化转型的重要引擎。合沃作为专业的物联网云服务提供商&#xff0c;致力于为企业提供高效、可靠的物联网工业云平台解决方案。本文将深入探讨物联网工业云平台的功能、解决行业痛点的能力以及如何…

用户数据的FLASH存储与应用(FPGA架构)

该系列为神经网络硬件加速器应用中涉及的模块接口部分&#xff0c;随手记录&#xff0c;以免时间久了遗忘。 一 背景 我们知道&#xff0c;在FPGA做神经网络应用加速时&#xff0c;涉及到权重参数的存储和加载。通常在推理过程中&#xff0c;会将权重参数存储在外部DDR或片上S…

WAAP全站防护是什么,有什么作用

WAAP全站防护是基于风险管理和WAAP理念打造的安全方案&#xff0c;以“体系化主动安全” 取代安全产品的简单叠加&#xff0c;为各类Web、API业务等防御来自网络层和应用层的攻击&#xff0c;帮助企业全面提升Web安全水位和安全运营效率。 主要的特性在于&#xff1a; 1.全周…

19双体系Java学习之数组的Arrays类

数组的Arrays类 ★小贴士 sort方法对数组进行排序&#xff0c;方法调用完成后&#xff0c;数组按升序排列。 binarySearch方法对数组进行二分查找&#xff0c;如果能找到需要查找的元素则返回该元素的下标&#xff0c;否则返回一个负数&#xff0c;详见binarySearch的范例代码。…

CSS:mix-blend-mode 颜色混合

一、属性 mix-blend-mode: normal; //正常 mix-blend-mode: multiply; //正片叠底 mix-blend-mode: screen; //滤色 mix-blend-mode: overlay; //叠加 mix-blend-mode: darken; //变暗 mix-blend-mode: lighten; //变亮 mi…

取钱——动态规划

题目链接&#xff1a;1.取钱 - 蓝桥云课 (lanqiao.cn) 用动态规划的方法&#xff0c;定义一个dp数组&#xff0c;存放从0开始的取钱所需要的钞票数&#xff08;0就是取0元&#xff0c;所以钞票数也是0&#xff09; package lanqiao;import java.util.Arrays; import j…

AI视频混剪定时发送|罐头鱼AI视频矩阵获客

AI视频混剪定时发送系统&#xff1a;智能化视频创作与发布一体化解决方案 随着数字内容的快速增长&#xff0c;视频已成为各行业推广和传播的首选方式。然而&#xff0c;许多人在制作高质量视频时面临挑战。现在&#xff0c;有了全新的AI视频混剪定时发送系统&#xff0c;您可以…

二叉树OJ练习

本文旨在讲解有关二叉树的OJ题目&#xff0c;希望读完本文&#xff0c;能让读者都二叉树有更深一步的认识&#xff01; 正文开始&#xff01; 106. 根据二叉树创建字符串 算法思想&#xff1a; 根据题目的输出结果&#xff0c;可以观察出如下规律&#xff01; 1.若左右结点都…

MySQL语法分类 DDL(2)

DDL&#xff08;2&#xff09; C(Create):创建 //复制表 create table 表名 like 被复制的表名;//数据类型 1. int : 整数类型 2. double : 小数类型 //double(5,2) 最多五位且保留两位小数 3. date : 日期类型 //只包含年月日 yyyy-MM-dd 4. datetime : 日期 //包含年月日时…

影像质感再升级:JOEL FAMULARO Phantom LUTs让作品焕然一新

JOEL FAMULARO Phantom LUTs是一套专业的电影级别的预设&#xff0c;旨在为电影制作人和视频编辑人员提供高质量的颜色校正和调整工具。它为用户提供了一系列精心设计的色彩预设&#xff0c;旨在帮助摄影师在电影、电视和照片后期制作中快速实现专业且一致的色彩风格。这些预设…

(含代码)利用NVIDIA Triton加速Stable Diffusion XL推理速度

在 NVIDIA AI 推理平台上使用 Stable Diffusion XL 生成令人惊叹的图像 扩散模型正在改变跨行业的创意工作流程。 这些模型通过去噪扩散技术迭代地将随机噪声塑造成人工智能生成的艺术&#xff0c;从而基于简单的文本或图像输入生成令人惊叹的图像。 这可以应用于许多企业用例&…

整型溢出问题及解决之道

【题目描述】 例题2-2 3n&#xff0b;1问题 猜想&#xff1a;对于任意大于1的自然数n&#xff0c;若n为奇数&#xff0c;则将n变为3n&#xff0b;1&#xff0c;否则变为n的一半。 经过若干次这样的变换&#xff0c;一定会使n变为1。例如&#xff0c;3→10→5→16→8→4→2→…

基于Spring Boot+Vue的校园二手交易平台

目录 一、 绪论1.1 开发背景1.2 系统开发平台1.3 系统开发环境 二、需求分析2.1 问题分析2.2 系统可行性分析2.2.1 技术可行性2.2.2 操作可行性 2.3 系统需求分析2.3.1 学生功能需求2.3.2 管理员功能需求2.3.3游客功能需求 三、系统设计3.1 功能结构图3.2 E-R模型3.3 数据库设计…

【蓝桥杯每日一题】填充颜色超详细解释!!!

为了让蓝桥杯不变成蓝桥悲&#xff0c;我决定在舒适的周日再来一道题。 例&#xff1a; 输入&#xff1a; 6 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1 输出&#xff1a; 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 2 2 1 1…

Requests教程-17-请求代理设置

上一小节我们学习了requests解决乱码的方法&#xff0c;本小节我们讲解一下requests设置代理的方法。 代理基本原理 代理实际上指的就是代理服务器&#xff0c; 英文叫作proxy server &#xff0c;它的功能是代理网络用户去取得网络信息。形象地说&#xff0c;它是网络信息的中…

【DFS深度优先搜索专题】【蓝桥杯备考训练】:迷宫、奶牛选美、树的重心、大臣的旅费、扫雷【已更新完成】

目录 1、迷宫&#xff08;《信息学奥赛一本通》&#xff09; 2、奶牛选美&#xff08;USACO 2011 November Contest Bronze Division&#xff09; 3、树的重心&#xff08;模板&#xff09; 4、大臣的旅费&#xff08;第四届蓝桥杯省赛Java & C A组&#xff09; 5、扫…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TimePicker)

时间选择组件&#xff0c;根据指定参数创建选择器&#xff0c;支持选择小时及分钟。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TimePicker(options?: TimePickerOptions)…