网络编程-网络基础

IO进程: 进程和进程之间的通信 - 信号 信号量 消息队列 有名管道 无名管道 共享内存 套接字

套接字: 不同主机 不同操作系统之间的 进程通信

干什么: 实现无线

局域网:同一局域网下IP网段一致

IP地址

1) IP地址 是 网络中的 主机的标识, 本质是二进制数字。

2) IP采用 点分十进制 表示

3) IP分类: 分为 IPV4 和 IPV6 (IPV6表示的范围更广)

4) IP长度 32位 (IPV4) 64位(IPV6)

5) 每个数据包 必须要携带 目标 IP 和 源IP地址

二级划分

IP=网络号+主机号

网络号:表示是否再同一个网段内(主要是同一网段,网络号是一样的)

主机号:本网段内主机的id(主机号在同一网段下,是唯一的)

二级划分的分类

IP二级划分所表示的范围

A类

0.0.0.0 - 127.255.255.255

大型网络

B类

128.0.0.0 - 191.255.255.255

中型网络 : 管理 和 监督互联网的组织

C类

192.0.0.0 - 223.255.255.255

小型网络:家用网络 ,教室网络

D类

224.0.0.0 - 239.255.255.255

用于 UDP的组播通信

E

240.0.0.0 - 255.255.255.255

保密单位:实验室, 军方

特殊的IP地址

不能分配给主机使用的地址

网络地址:标识网络的起始地址,该地址不会分配到主机。(表示方式:主机号全为0的地址,为网络地址)

例: 192.168.50. 0 主机号为 0 代表 网络地址, 不会被主机分配

广播地址:用于给局域网下的所有主机发送数据使用,不会分配到主机(表示方式:主机号全为1的地址,为广播地址)

练习:

IP为192.168.1.0,同一网段最多可以连接多少个主机?

c类,最后8位为主机号,网络地址和广播地址不会被分配,256-2=254

子网掩码

作用:辅助标记IP的网络号和主机号(更快的去区分网络和主机号)

特点:网络号全置为1,主机号全部置为0

练习:

子网掩码为 255.255.255.0, 该网段最多可以容纳多少台主机

c类,最后8位为主机号,网络地址和广播地址不会被分配,256-2=254

三级划分

作用:在二级划分的基础上,再次划分,提高IP的利用率

IP=网络号+子网号+主机号

子网号:从主机号中划分出几位,充当网络号。

练习:

  1. 已知一个子网掩码号为255.255.255.192,问,最多可以连接多少台主机?

C类 255.255.255.0 - 》三级划分 -》 192 -》 1100 0000

根据子网掩码特点: 主机号全为 0

0 - 63 -》 64 -》 去掉网络地址 和 主机地址 -》 62

  1. 有两台电脑主机,在最少浪费IP地址的情况下.将172.16.14.4与172.16.13.2划归为同一网段,子网掩码应该设置为

14: 0000 11 10 255.255.252.0

13: 0000 11 01

  1. 已知IP: 192.168.50.183, 子网掩码: 255.255.255.128, 问该IP的网段为多少?

192.168.50.183 1100 0000.1010 1000. 0011 0010. 1 011 0111

子网掩码: 1111 1111. 1111 1111. 1111 1111. 1 000 0000

193.168.50.128

  1. 通过子网掩码 255.255.255.128 该子网掩码可以划分几个子网网段?

C类 -》 1 000 0000 >> 两个子网网段

0

1

2

  1. 某公司有四个部门:行政、研发1、研发2、营销,每个部门各30台计算机接入公司局域网交换机,在192.168.1.0网

段内为每个部门划分子网,子网掩码应该怎么设置,每个子网的地址范围分别是什么?(4个部门之间不能通信)

255.255.255.192

范围:

192.168.1.0-192.168.1.63

192.168.1.128-192.168.1.192

等(自己算)

网络模型

网络模型采用分层的方式,每层实现不同的功能

网络中的数据包的传输流程

osI和TCP/IP的模型对应图

UDP和TCP

相同点:都属于传输层协议,都是全双工的通信

TCP-传输控制协议

该协议是一种高可靠性的有连接的协议

TCP容易粘包

*可靠性的评判标准:

数据无丢失, 数据无失误, 数据无失序, 数据无重复到达

TCP为什么具有高可靠性(重点

三次握手和四次挥手机制

序列号和应答号机制

超时/错误重传机制

拥堵和流量控制机制

TCP的应用场景

对于传输质量要求较高的场合,以及大量数据传输的场合。

UDP-用户数据报协议

该协议是一种不可靠的无连接的协议

UDP是一种容易造成丢包的协议,不保证数据的完整性

UDP的应用场景

应答较为困难的网络中可以使用UDP。

socket套接字

什么是socket

  1. socket是一个编程接口
  2. socket是一个特殊的文件描述符
  3. socket是一种通信机制
  4. 一套用于建立连接的数字

socket的类型

流式套接字(SOCK_STREAM)对应协议-TCP

特点:面向连接,可靠性高的数据传输服务

数据报套接字(SOCK_DGRAM)对应协议-UDP

特点:无连接的,不可靠的数据传输服务

原始套接字(SOCK_RAM)

特点:较低层次的协议,例入ICMP中使用

socket的功能

socket可以在计算机中创建两个缓存区,一个是发送缓存区,一个是接收缓存区。

端口号

为了区分一台主机接收到的数据包,应该交给那个进程来处理

端口号的长度:2byte(IP长度为4byte)

众所周知端口(被占用): 0~1023(1~255之间为众所周知端口,通常由UNIX系统占用)

比如 文件传输端口 TFTP 端口号为 69

已登记端口:1024~49151 (----可用来建立与其它主机的会话----)

动态或私有端口:49152~65535 --固定某些服务使用--

字节序

字节序:不同类型的CPU主机,内存存储大于一个字节类型的数据,在内存中的存放顺序

分类:

主机字节序(小端):地址低位存放数据低位,地址高位存放数据高位

网络字节序(大端):地址高位存放数据低位,地址地位存放数据高位

在主机上的字节序一般都为主机字节序。在网络中传输的数据,大于一个字节的数据类型,必须转换为网络字节序

端口号转换专用接口

头文件: #include<arpa/inet.h>
原型:  u_long htonl (u_long hostlong)     u_short htons (u_short short)
//端口号一般为 1024 - 49151, 两个字节足够,基本不需要long
功能: 主机字节序的端口 转 网络字节序 原型:  u_long ntohl (u_long hostlong);   u_short ntohs (u_short short);
功能: 网络字节序的端口 转 主机字节序

IP转换专用接口

 in_addr_t  inet_addr(const char *strptr);
头文件:   #include<sys/socket.h>   #include<netinet/in.h>    #include<arpa/inet.h>
原型:       //该参数是字符串
功能:    主机字节序(点分十进制形式的IP) 转为网络字节序
参数:     const char *strptr: 字符串typedef uint32_t in_addr_t;  (通过vi -t 追一下)struct in_addr { in_addr_t   s_addr;}; 
返回值: 返回一个无符号长整型数(无符号32位整数用十六进制表示), 否则NULLchar *inet_ntoa(struct in_addr in);
头文件 :   #include <arpa/inet.h>  #include<sys/socket.h>  #include<netinet/in.h>              
功能:    将网络字节序二进制地址转换成主机字节序。 
参数:     stuct in_addr in addr  : 只需传入一个结构体变量,该变量代表IP
返回值:  返回一个字符指针, 否则NULL;

TCP编程

socket创建套接字

函数原型:
int socket(int domain, int type, int protocol);调用形式:
socket(协议族,套接字类型,0);参数domain:协议族
参数type:套接字类型
参数protocol:传0,表示根据第二个参数自动匹配协议返回值:创建成功返回sockfd描述符(0->标准输入,1->标准输出,2->标准错误,3->自定义创建的socket)创建失败返回-1,更新errno

bind绑定套接字

vi -t :查询数据类型的shell指令

函数原型:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
头文件: #include<sys/types.h>  #include<sys/socket.h> #include<netinet/in.h>  #include<netinet/ip.h>功能:绑定 IP 和 port参数:sockfd:套接字addr:用于通信结构体 (提供的是通用结构体,需要根据选择通信方式,填充对应结构体-通信当时socket第一个参数确定,需要强转)(结构体之间的强转,不可以直接使用普通数据类型强转,因为结构体字节对齐原则,具体大小不一致,会数据丢失,所以可使用结构体指针,对结构体地址进行强转)   addrlen:结构体大小   返回值:成功 0   失败-1,更新errno通用结构体:struct sockaddr {sa_family_t  sa_family;char        sa_data[14];}ipv4通信结构体:
struct sockaddr_in {sa_family_t    sin_family;  ----协议族in_port_t      sin_port;   ----端口struct in_addr sin_addr;     ----ip结构体
};
struct in_addr {uint32_t       s_addr;     --ip地址
};

listen监听

int listen(int sockfd, int backlog);
功能:监听,将主动套接字变为被动套接字
参数:sockfd:套接字backlog:等待连接队列中,客户端请求链接的最大个数,不能写0.一般写6-8个返回值:成功 0   失败-1,更新errno  

accept阻塞等待连接

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);功能:阻塞函数,阻塞等待客户端的连接请求,如果有客户端连接,则accept()函数返回,返回一个用于通信的套接字文件;
参数:Sockfd :套接字addr: 链接客户端的ip和端口号如果不需要关心具体是哪一个客户端,那么可以填NULL;addrlen:结构体的大小如果不需要关心具体是哪一个客户端,那么可以填NULL;
返回值: 成功:通信的文件描述符; 失败:-1,更新errno新errno  

recv接收数据

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能: 接收数据 
参数: sockfd: acceptfd ;buf  存放位置len  大小flags  一般填0MSG_DONTWAIT  非阻塞
返回值: < 0  失败出错  更新errno==0  表示客户端退出>0   成功接收的字节个数

练习

 

  1. 服务器可以循环接收客户端的数据;
  2. 当客户端退出后, 服务器阻塞等待下一个客户端的连接,而后继续通信;
  3. 当有客户端连接时, 服务器端 打印客户端的IP 和 Port信息;
  4. 将代码的 send 和 recv 改为 write 和 read, 测试一下效果;
  5. 利用argv[ ] 采用终端输入的方式, 输入IP 和 Port ,从而bind绑定;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>	
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
int main(int argc, const char *argv[])
{ while(1){//创建套接字//AF_INET---ipv4协议族//SOCK_STREAM---流式套接字(TCP)//0---根据第二个参数自动匹配协议int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){perror("socket is err");return -1;}//bind绑定套接字struct sockaddr_in saddr;saddr.sin_family = AF_INET;//将主机字节序的端口号转换为网络字节序int port;char p[128]={0};printf("请输入Port:");scanf("%d",&port);printf("请输入IP:");scanf("%s",p);saddr.sin_port = htons(port);saddr.sin_addr.s_addr = inet_addr(p);//绑定填充的结构体属性到sockfd套接字上int bindfd = bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));if(bindfd<0){perror("bind is err");//return -1;}printf("%ld %ld\n",sizeof(saddr),sizeof(struct sockaddr_in));//listen监听 创建监听队列int listenfd = listen(sockfd,5);if(listenfd < 0){perror("listen is err");return -1;}//建立通信//如果没有客服端链接,accept回阻塞等待客户端链接//第二个参数用于获取来链接的客服端的信息//返回值为一个进行通信的文件描述符printf("accept.......\n");	struct sockaddr_in aaddr;int len = sizeof(aaddr);aaddr.sin_family = AF_INET;//int acceptfd = accept(sockfd,NULL,NULL);	int acceptfd = accept(sockfd,(struct sockaddr*)&aaddr,&len);	int kfport = ntohs(aaddr.sin_port);char* kfip = inet_ntoa(aaddr.sin_addr);printf("客服端端口:%d\n客服端IP为:%s\n",kfport,kfip);if(acceptfd < 0){perror("accept id err");char buf[128]={0};return -1;}//接收数据//accept是建立通信的文件描述符(不能用sockfd)//第四个参数常用0和MSG_NOWAIT//0---表示阻塞,如果没有数据接收,则阻塞等待//MSG_NOWAIT---表示非阻塞while(1){char buf[128]={0};int recfd = recv(acceptfd,buf,sizeof(buf),0);if(recfd < 0){perror("recv is err");return -1;}else if(recfd == 0){printf("client is exit\n");break;}else{printf("client输入的数据为:%s\n",buf);}}close(sockfd);close(acceptfd);}return 0;
}

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

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

相关文章

37_DC-5靶机渗透测试、nmap使用、kail漏洞库使用、系统提权、反弹shell到kali、留后门、蚁剑连接webshell、文件包含漏洞利用、NC用法

环境准备 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/dc-5,314/ 百度网盘&#xff1a;https://pan.baidu.com/s/1lqFMjoqQpIl4DA-Amb00pA?pwd9LJY 攻击机&#xff1a;kali&#xff08;192.168.58.130&#xff0c;IP是各自不同的&#xff09; 靶机&#xff1…

SystemUI手势操作隐藏显示导航栏

在Android 12中&#xff0c;通过SystemUI手势操作来隐藏和显示导航栏主要涉及对系统UI的定制和编程控制。以下是一些实现这一功能的方法&#xff1a; 默认是隐藏 向上滑动 第一类. 使用WindowInsetsController Android 12引入了一个新的WindowInsetsController类&#xff0c;它…

【数据分享】1999—2022年地级市地区生产总值及一二三产构成数据(Shp/Excel格式)

在之前的文章中&#xff0c;我们分享过基于2000-2023年《中国城市统计年鉴》整理的1999-2022年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、一般公共预算收支状况、…

bootchart抓Android系统启动各阶段性能数据

最近在做Android系统启动优化&#xff0c;首要任务是找到启动过程中各阶段耗时点&#xff0c;进而有针对性地进行优化。主要用bootchart抓开机数据&#xff0c;本文主要记录下工具的使用方法。 1.抓开机数据 adb root adb shell ‘touch /data/bootchart/enabled’ adb rebo…

STM32标准库学习笔记-6.定时器-输入捕获

参考教程&#xff1a;【STM32入门教程-2023版 细致讲解 中文字幕】 定时器输入捕获 IC&#xff08;Input Capture&#xff09;输入捕获输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率…

8.14-LVS主从+nginx的haproxy+mysql的haproxy+读写分离

一、LVS-主从数据库 # nat # 添加规则 [rootDS ~]# ipvsadm -A -t 192.168.2.130:3306 -s rr [rootDS ~]# ipvsadm -a -t 192.168.2.130:3306 -r 192.168.2.40:3306 -m [rootDS ~]# ipvsadm -a -t 192.168.2.130:3306 -r 192.168.2.42:3310 -m [rootDS ~]# ipvsadm -Ln IP Vir…

计算机毕业设计选什么题目好? springboot 大学志愿填报系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

ffmpeg的基础命令

文章目录 ffmpeg/ffplay/ffprobe区别ffmpeg 的作用ffplay的作用ffprobe的作用 ffmpeg使用概述功能概述转码过程简单使用FFMPEG -i常用的 -i例子 ff***工具之间共享的选项ffmpeg主要选项ffmpeg提取音视频数据ffmpeg命令修改原有的视频格式ffmpeg命令裁剪和合并视频拼接视频的方式…

数据结构—— 初识二叉树

1.树概念及结构 1.1树的概念 树是由根和子树构成 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 1. 树有…

20240819 每日AI必读资讯

&#x1f4da;AI爆料人遭全网封禁&#xff01;OpenAI等25个机构祭大招&#xff0c;一眼辨别AI机器人 - 最近半个月&#xff0c;全网被OpenAI的「AI爆料人」「草莓哥」iruletheworldmo愚弄。所有人没有等他预测的GPT-4o large模型&#xff0c;反被AI初创MultiOn创始人揭穿身份—…

Git安装包及怎么再windows上运行

第一步&#xff1a;下载git。 国内 Git for Windows. 国内镜像 感谢GitHub - waylau/git-for-win: Git for Windows. 国内直接从官网下载比较困难&#xff0c;需要翻墙。这里提供一个国内的下载站&#xff0c;方便网友下载 安装步骤&#xff1a; Git for Windows安装和基本…

【C语言可变参数函数的使用与原理分析】

文章目录 1 前言2 实例2.1实例程序2.2程序执行结果2.3 程序分析 3 补充4 总结 1 前言 在编程过程中&#xff0c;有时会遇到需要定义参数数量不固定的函数的情况。 C语言提供了一种灵活的解决方案&#xff1a;变参函数。这种函数能够根据实际调用时的需求&#xff0c;接受任意…

ansible相关模块

copy模块(重点) copy模块⽤于对⽂件的远程拷⻉操作&#xff08;如把本地的⽂件拷⻉到远程 的机器上) https://docs.ansible.com/ansible/latest/modules/copy_module.htm l#copy-module 在master上准备⼀个⽂件&#xff0c;拷⻉此⽂件到group1的所有机器上 使⽤content参数直…

zabbix-配置监控远程主机

1.在被监控主机上配置zabbix-agent 1.获取zabbix官方源 rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm# 替换阿里源&#xff0c;这一步很重要 sed -i s#http://repo.zabbix.com#https://mirrors.aliyun.com/zabb…

微服务架构设计中的常见的10种设计模式

微服务架构设计的概念 微服务架构&#xff08;Microservices Architecture&#xff09;是一种用于构建分布式系统的软件设计模式。它将大型应用程序拆分成一组小型、自治的服务&#xff0c;每个服务都运行在其独立的进程中&#xff0c;服务之间通过轻量级的通信机制&#xff08…

clickhouse集群+Zk优化-解决只读模式,主节点磁盘增长快

问题1&#xff1a;数据库进入只读模式 最近在项目中使用clickhouse的时候&#xff0c;遇到了一个批量插入后报错的问题。报错的内容是数据库进入了只读模式&#xff0c;导致数据写不进去。发现有大量的批量写入报错日志信息。&#xff08;关键异常信息&#xff1a;DB::Exceptio…

高德地图SDK Android版开发 6 显示覆盖物

高德地图SDK Android版开发 6 显示覆盖物 前言地图类中覆盖物的接口覆盖物类Marker示例Polyline示例Polygon示例Arc示例Circle示例移除示例效果图 Marker的更多属性常用属性交互动画其它属性 折线的更多属性常用属性其它属性 多边形的更多属性常用属性其它属性 Arc的更多属性Ci…

[数据结构] RBTree 模拟实现RBTree

标题&#xff1a;[数据结构] RBTree && 模拟实现RBTree 水墨不写bug 目录 一、红黑树的概念 二、map和set的封装 三、红黑树的实现 1、红黑树节点的定义 2、红黑树的结构 3、红黑树的插入 1.名称 2.插入节点的颜色 红黑树的insert 实现 情况一&#xff1a;不…

QT翻金币小游戏(含音频图片文件资源)

目录 QT翻金币小游戏 音频图片资源文件获取 效果展示 图片 视频 实现代码 main.cpp mymainwindow.h mymainwindow.cpp startscene.h startscene.cpp selectscene.cpp playscene.h playscene.cpp mypushbutton.h mypushbutton.cpp dataconfig.h dataconfig.cpp QT…

Spring Boot: 2.7.x 至 2.7.18 及更旧的版本,漏洞说明

本文提供的修复指南将帮助开发者有效规避 CVE-2024-38808 和 CVE-2024-38809 的风险。如果你正在使用老版本的 Spring Boot&#xff0c;请尽快参考本文进行修复与升级。 此漏洞来源于spring官网&#xff1a;https://spring.io/blog/2024/08/14/spring-framework-releases-fixe…