网络、网络协议模型、UDP编程——计算机网络——day01

今天来到了网络编程,主要讲了网络、网络协议模型以及UDP编程

网络

网络主要是进行:数据传输和数据共享

网络协议模型

OSI协议模型
    应用层              实际发送的数据
    表示层              发送的数据是否加密
    会话层              是否建立会话连接
    传输层              数据传输的方式(数据报、流式)
    网络层              数据的路由(如何从一个局域网到达另一个局域网)        IP地址
    数据链路层          局域网下如何通信
    物理层              物理介质的连接

TCP/IP协议模型   
    应用层              传输的数据
    传输层              传输的方式
    网络层              数据如何从一台主机到达另一台主机
    网络接口层          物理介质的连接

应用层

应用层主要的传输协议有:
		HTTP    超文本传输协议
        HTTPS   
        FTP     文件传输协议
        TFTP    简单文本传输协议
        SMTP    邮件传输协议
        MQTT    
        TELNET  
  		..

传输层

	UDP     用户数据报协议
            	特点:
                1.实现机制简单
                2.资源开销小
                3.不安全不可靠

    TCP     传输控制协议
           	    特点:
                1.实现机制复杂
                2.资源开销大
                3.安全可靠

网络层

网络层这块主要讲一下IPv4

	IP地址:唯一标识网络中一台主机的标号
   	IP地址:网络位 + 主机位
   	子网掩码:用来标识IP地址的网络位和主机位
    子网掩码是1的部分表示IP地址的网络位
    子网掩码是0的部分表示IP地址的主机位
    网段号:网络位不变,主机位全为0,表示网段号
    广播地址:网络位不变,主机位全为1,表示广播地址
	
	IP地址类型:
    A类
        1.0.0.0 - 126.255.255.255
        子网掩码:255.0.0.0
        管理超大规模网络
        10.0.0.0 - 10.255.255.255 

    B类
        128.0.0.0 - 191.255.255.255
        子网掩码:255.255.0.0 
        管理大中规模型网络
        172.16.0.0 - 172.31.255.255

    C类
        192.0.0.0 - 223.255.255.255
        子网掩码:255.255.255.0
        管理中小规模型网络 
        192.168.0.0 - 192.168.255.255

    D类
        224.0.0.0 - 239.0.0.0
        用于组播

    E类
        240.0.0.0 - 255.255.255.255 
        用于实验

UDP编程

也是进程间socket套接字编程

1.发端

socket
int socket(int domain, int type, int protocol);
	功能:
	    创建一个用来通信的文件描述符
	参数:
	    domain:使用的协议族 AF_INET (IPv4协议族)
	    type:套接字类型
	        SOCK_STREAM:流式套接字
	        SOCK_DGRAM:数据报套接字
	        SOCK_RAW:原始套接字
	    protocol:协议
	        默认为0 
	返回值:
	    成功返回文件描述符
	    失败返回-1 
sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
              const struct sockaddr *dest_addr, socklen_t addrlen);
	功能:
	    利用套接字向指定地址发送数据信息 
	参数:
	    sockfd:套接字文件描述符
	    buf:发送数据空间首地址
	    len:发送数据的长度
	    flags:属性默认为0 
	    dest_addr:目的地址信息存放的空间首地址
	    addrlen:目的地址的长度

	struct sockaddr_in {
	    sa_family_t    sin_family; /* address family: AF_INET */
	    in_port_t      sin_port;   /* port in network byte order */
	    struct in_addr sin_addr;   /* internet address */
	};

	/* Internet address. */
	struct in_addr {
	    uint32_t       s_addr;     /* address in network byte order */
	};
	          
	返回值:
	    成功返回实际发送字节数
	    失败返回-1 
recvfrom
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
	功能:
	    从套接字中接收数据
	参数:
	    sockfd:套接字文件描述符
	    buf:存放数据空间首地址
	    flags:属性 默认为0 
	    src_addr:存放IP地址信息的空间首地址
	    addrlen:存放接收到IP地址大小空间的首地址
	返回值:
	    成功返回实际接收字节数
	    失败返回-1 
inet_addr、htons
inet_addr:
	in_addr_t inet_addr(const char *cp);
	功能:  
	    将字符串IP地址转换为内存中的IP地址 

htons
	uint16_t htons(uint16_t hostshort);
	功能:
	    将本地字节序转换为网络的大端字节序

eg:编写程序实现从终端接收字符串发送给 windows软件调试助手,并接受软件助手的回复,显示在终端屏幕上

#include"head.h"

int main(void)
{
	int sockfd = 0;
	struct sockaddr_in recvaddr;	
	struct sockaddr_in addc;
	char tmpbuff[1024] = {"hello world"};	//发送的字符串
	char recvbuff[1024] = {0};
	ssize_t nsize = 0;
	socklen_t addrlen;

	sockfd = socket(AF_INET,SOCK_DGRAM,0);	//参数1:IPv4协议族;参数2:数据报套接字;参数3:协议,默认为0
	if(-1 == sockfd)
	{
		perror("fail to socket");
		return -1;
	}
	
	
	recvaddr.sin_family = AF_INET;
	recvaddr.sin_port = htons(50000);	//将端口50000转为网络的大端模式
	recvaddr.sin_addr.s_addr = inet_addr("192.168.1.104");//将字符串IP地址转为内存中的IP地址
	addrlen = sizeof(addc);
	nsize = sendto(sockfd,tmpbuff,strlen(tmpbuff),0,(struct sockaddr *)&recvaddr,sizeof(recvaddr));
	if(-1 == nsize)
	{
		perror("fail to sendto");
		return -1;
	}

	printf("成功发送 %ld 字节!\n",nsize);

	recvfrom(sockfd,recvbuff,sizeof(recvbuff),0,(struct sockaddr *)&addc,&addrlen);	//接收
	printf("%s",recvbuff);

	close(sockfd);

	return 0;
}

结果:
在这里插入图片描述

我们可以看到

发端:socket -> sendto -> close

收端: socket -> bind -> recvfrom -> close

UDP需要注意的细节点

1.UDP是无连接,发端退出,收端没有任何影响
2.UDP发送数据上限,最好不要超过1500个字节
3.UDP是不安全不可靠的,连续且快速的传输数据容易产生数据丢失

UDP包头长度:8个字节

 分别是:源端口号(2个字节)
		 目的端口号(2个字节)
	     长度(2个字节)
		 校验和(2个字节)

eg:要求在不同主机中编写两个程序,实现全双工聊天功能
1.进入软件后接收当前用户的昵称
2.显示的格式为 对方用户昵称(对方IP:对方端口)>接收到的内容
3.用户输入".quit"退出聊天
4.网络通信时收发结构体
struct person
{
char name[32];
char text[512];
};

head.h
#ifndef __HEAD_H__
#define __HEAD_H__

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/in.h>

struct person
{
	char name[32];
	char text[512];
};

#endif

client.c

#include"head.h"

int sockfd = 0;
struct sockaddr_in sendaddr;
struct sockaddr_in recvaddr;
ssize_t nsize = 0;
socklen_t addrlen = sizeof(recvaddr);

void *threadSend(void *arg)	//发端
{
	struct person user;
		
	scanf("%s",user.name);
	nsize = sendto(sockfd,user.name,strlen(user.name),0,(struct sockaddr *)&sendaddr,sizeof(sendaddr));
	if(-1 == nsize)
	{
		perror("fail to sendto");
		return NULL;
	}
	while(1)
	{
		memset(&user.text,0,sizeof(user.text));
		scanf("%s",user.text);
		nsize = sendto(sockfd,user.text,strlen(user.text),0,(struct sockaddr *)&sendaddr,sizeof(sendaddr));
		if(-1 == nsize)
		{
			perror("fail to sendto");
			return NULL;
		}

		if(!strcmp(user.text,".quit"))
		{
			break;
		}
	}
}

void *threadRecv(void *arg)
{
	struct person user;
	
	nsize = recvfrom(sockfd,user.name,sizeof(user.name),0,(struct sockaddr *)&recvaddr,&addrlen);		//首先接收名字
	if(-1 == nsize)
	{
		perror("fail to recvfrom");
		return NULL;
	}

	while(1)
	{
		memset(&user.text,0,sizeof(user.text));		//刷新
		nsize = recvfrom(sockfd,user.text,sizeof(user.text),0,(struct sockaddr *)&recvaddr,&addrlen);
		if(-1 == nsize)
		{
			perror("fail to recvfrom");
			return NULL;
		}

		if(!strcmp(user.text,".quit"))
		{
			break;
		}
		printf("%s %s:%d > %s\n",user.name,inet_ntoa(recvaddr.sin_addr),ntohs(recvaddr.sin_port),user.text);
	}
}

int main(void)
{
	int ret = 0;

	pthread_t send;
	pthread_t recv;

	pthread_create(&send,NULL,threadSend,NULL);		//创建发送线程
	pthread_create(&recv,NULL,threadRecv,NULL);		//创建接收线程

	sockfd = socket(AF_INET,SOCK_DGRAM,0);	
	if(-1 == sockfd)
	{
		perror("fail to socket");
		return -1;
	}

	sendaddr.sin_family = AF_INET;
	sendaddr.sin_port = htons(50000);
	sendaddr.sin_addr.s_addr = inet_addr("192.168.1.174");

	recvaddr.sin_family = AF_INET;
	recvaddr.sin_port = htons(50000);
	recvaddr.sin_addr.s_addr = inet_addr("192.168.1.152");
	ret = bind(sockfd,(struct sockaddr *)&recvaddr,sizeof(recvaddr));	//绑定接收端的IP地址和端口号
	if(-1 == ret)
	{
		perror("fail to bind");
		return -1;
	}

	pthread_join(send,NULL);
	pthread_join(recv,NULL);

	close(sockfd);

	return 0;
}

结果:
在这里插入图片描述

以上就是今天内容!

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

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

相关文章

2024暑期实习八股笔记

文章目录 自我介绍MySQL索引索引种类、B树聚簇索引、非聚簇索引联合索引、最左前缀匹配原则索引下推索引失效索引优化 日志、缓冲池redo log&#xff08;重做日志&#xff09;刷盘时机日志文件组 bin log&#xff08;归档日志&#xff09;记录格式写入机制 两阶段提交undo log&…

洛谷 素数环 Prime Ring Problem

题目描述 PDF 输入格式 输出格式 题意翻译 输入正整数 nn&#xff0c;把整数 1,2,\dots ,n1,2,…,n 组成一个环&#xff0c;使得相邻两个整数之和均为素数。输出时&#xff0c;从整数 11 开始逆时针排列。同一个环恰好输出一次。n\leq 16n≤16&#xff0c;保证一定有解。 多…

某宝某猫商品详情页面数据逆向

​​​​​逆向网址 aHR0cHM6Ly93d3cudGFvYmFvLmNvbS8 aHR0cHM6Ly93d3cudG1hbGwuY29tLw 逆向链接 aHR0cHM6Ly9kZXRhaWwudG1hbGwuY29tL2l0ZW0uaHRtP2lkPTc0NDk3NDQ4NTI3NSZwdmlkPTFiMzdmNjUyLTRjNDYtNGM2Ni04MDg4LWRhYmJiZDJhMzJhNSZzY209MTAwNy40MDk4Ni4yNzY3NTAuMCZzcG09YTIxY…

12、MongoDB -- 通过 SpringBoot 整合 Spring Data MongoDB 操作 MongoDB 数据库(传统的同步API编程)

目录 通过 SpringBoot 整合 Spring Data MongoDB 操作 MongoDB 数据库&#xff08;传统的同步API编程&#xff09;演示前提&#xff1a;登录单机模式的 mongodb 服务器命令登录【test】数据库的 mongodb 客户端命令登录【admin】数据库的 mongodb 客户端命令 代码演示同步API编…

基于SpringBoot和PotsGIS的各省地震震发可视化分析

目录 前言 一、后台接口研发 1、控制层实现 2、Mapper访问层 3、空间查询分析 二、前端可视化展示 1、主体地图定义 2、行政区划列表定义 3、行政区划定位 三、数据分析 1、北京市 2、广东省 3、青海省 4、湖南省 总结 前言 在之前的博文中&#xff0c;我们…

【Python】一文详细介绍 plt.rcParamsDefault 在 Matplotlib 中的原理、作用、注意事项

【Python】一文详细介绍 plt.rcParamsDefault 在 Matplotlib 中的原理、作用、注意事项 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程…

每日OJ题_牛客OR57 手套

目录 牛客OR57 手套 解析代码 牛客OR57 手套 手套_牛客题霸_牛客网 class Gloves { public:int findMinimum(int n, vector<int> left, vector<int> right) {} }; 解析代码 class Gloves { public:int findMinimum(int n, vector<int> left, vector<i…

机器学习——Q-Learning

Outline Critic 从头往后&#xff0c;逐渐累积 新时刻跟前一时刻有关 不同的方法得到不同的假设&#xff0c;得到不同的结果 Q-function 在状态s下强制执行a得到对应的奖励 目标网络 targe一直在变 将其中的一个Q进行固定 sample a batch udpdate Q-function …

2023年中国高校大数据挑战赛D题参考论文发布(全网首发)

腾讯文档】2023年大数据挑战赛资料说明 https://docs.qq.com/doc/DSEpWUVFySm1ObFB0 基于数据分析的行业职业技术培训能力评价 摘要 中国是制造业大国&#xff0c;产业门类齐全&#xff0c;每年需要培养大量的技能娴熟的技术工人进入工厂。本文将基于题目给出的数据&#x…

输出int型最大值、最小值的小妙招

如果在算法竞赛中要求输入数据是一个范围很大的数&#xff0c;而你又忘了int型的数据范围&#xff0c;这时该怎么办呢&#xff1f; 比如洛谷P1001号题目&#xff1a; 【题目描述】 输入两个整数a,b&#xff0c;输出它们的和&#xff08;∣a∣,∣b∣≤&#xff09;。 【输入…

微信小程序开发系列(二十)·wxml语法·setData()修改对象类型数据、ES6 提供的展开运算符、delete和rest的用法

目录 1. 新增单个、多个属性 1.1 新增单个属性 1.2 新增多个属性 2. 修改单个、多个属性 2.1 修改单个属性 2.2 修改多个属性 3. 优化 3.1 ES6 提供的展开运算符 3.2 Object.assign()将多个对象合并为一个对象 4. 删除单个、多个属性 4.1 删除单个属性 …

leetcode 热题 100_旋转图像

题解一&#xff1a; 翻转数组&#xff1a;先将数组沿右上-左下对角线翻转&#xff0c;再将数组上下翻转。 class Solution {public void rotate(int[][] matrix) {int n matrix.length;for (int i 0; i < n; i) {//沿右上-左下对角线翻转for (int j 0; j < n - i - 1…

Corel会声会影视频编辑软件英文名是Corel VideoStudio2023

Corel会声会影视频编辑软件英文名是Corel VideoStudio2023&#xff0c;可以抓取、编制和导出多种常见的视频格式。介绍整理从早期的会声会影9、会声会影10后到会声会影X系列版本包括X2、X3、X4、X5、X6、X7、X8、X9、X10&#xff0c;2018&#xff0c;2019&#xff0c;2020&…

分布式之Ribbon使用以及原理

Ribbon使用以及原理 1、负载均衡的两种方式 服务器端负载均衡 传统的方式前端发送请求会到我们的的nginx上去&#xff0c;nginx作为反向代理&#xff0c;然后路由给后端的服务器&#xff0c;由于负载均衡算法是nginx提供的&#xff0c;而nginx是部署到服务器端的&#xff0c;所…

动态代理以及Retrofit的原理

代理模式&#xff09; 首先什么是代理模式&#xff1f; 代理模式就是通过引入代理对象去帮助真实对象完成一些事情&#xff0c;防止直接访问目标对象给系统带来不必要的复杂性。 代理模式一般分为三个角色&#xff1a; 抽象角色&#xff1a; 指代理对象和真实对象对外提供的…

YOLOv8_pose-Openvino和ONNXRuntime推理【CPU】

1 环境&#xff1a; CPU&#xff1a;i5-12500 Python&#xff1a;3.8.18 2 安装Openvino和ONNXRuntime 2.1 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包&#xff0c;主要用于对深度推理做优化。 Openvino内部集成了Opencv、Tens…

数据结构--链表和递归

前面我们所学习的线性数据结构 1、动态数组 2、栈 3、队列 它们的底层都是依托于静态的数组所实现&#xff1a;靠resize解决固定容量的问题 一、链表 1、链表&#xff1a;真正的动态数据结构 优点&#xff1a;不需要处理固定容量的问题&#xff0c;是真正的动态数据结构 …

【leetcode C++】最小栈

leetcode 155. 最小栈 题目 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获…

2024.3.11

作业&#xff1a; #include <iostream> #include<iomanip> #include<string> using namespace std;int main() {string str; // array<char,128> a; // array<char,128>::iterator iter;cout << "请输入一个字符串:" <…

位运算#蓝桥杯

位运算#蓝桥杯 文章目录 位运算#蓝桥杯1、小蓝学位运算2、异或森林3、位移4、笨笨的机器人5、博弈论 1、小蓝学位运算 #include<bits/stdc.h> using namespace std; using LL long long; const LL N 1e97; template<int kcz> struct ModInt { #define T (*this)…