一、目的

        网络编程的目的实际上也是进程通信的一种方式,不过它可以在不同的主机上进行通信;

二、需要解决的问题

  1. 主机与主机之间物理层面必须互联互通。

  • 指的是参与通信的计算机(主机)需要通过物理设备建立连接(光纤、网线),确保数据能够在物理介质上传输
  • 具体包括:网卡正常工作、网线或无线信号等传输介质连接正常、路由器 / 交换机等网络设备配置正确

  2. 进程与进程在软件层面必须互联互通。

  • 指的是在物理连接通畅的基础上,不同主机上的应用程序进程需要通过网络协议进行逻辑连接
  • 具体包括:使用正确的 IP 地址和端口号、采用相同的网络协议(如 TCP/UDP)、进程已正确绑定端口并处于监听状态

举个例子:

这是一个传输机制图解;每个有IP地址的方格代表一个主机;其中,交换机就是局域网内的主机通信的物理设备;但是如果要在广域网与其他网段的主机进行通信的话,就需要“路由器+ 链路” 来负责跨网段转发。简单说,左边局域网和右边局域网,靠路由器之间的物理链路打通,数据就能从左传到右、右传到左。

至于进程,两边进程得用 相同的协议(比如 TCP/UDP) 说话。比如左边进程用 TCP 发数据,右边进程也得用 TCP 收,否则 “语言不通” 没法交流。而每个进程要通信,得绑定 IP + 端口。比如左边主机 192.168.0.140 上的QQ给另一台主机的QQ发消息,得告诉系统:“我在 192.168.0.140 这台机器,监听 QQ 端口,别人可以给我发数据”;右边主机 192.168.1.140 上的进程同理。如果端口不同,就有可能接收不到信息;

所以,在这里总结几个概念:

  • IP地址:计算机的软件地址,用来标识计算机设备(由路由器动态分配)
  • MAC地址:计算机的硬件地址(固定)
  • 网络的端口号:标记同一主机上的不同网络进程

需要注意的是:

  • 在同一个局域网下,不能有2个一模一样的ip地址;
  • 路由器在进行远距离数据传输的时候,会对路径进行选择规划,力求最短/最快路径

图解如下:

三、网络协议

网络协议即是不同体系结构设备间,网络通信的标准

OSI七层模型

意味开放系统互联模型(open system interconnect)

它是一个理论模型:

应用层要传输的数据信息,如文件传输,电子邮件等
表示层数据加密,解密操作,压缩,解压缩(安全性)
会话层建立数据传输通道,  (会话)
传输层传输的方式  UDP  TCP   端口号
网络层实现数据路由,路径规划    路由器  ip
数据链路层封装成帧(帧数据),点对点通信(局域网内通信),差错检测   交换机  ARP
物理层

定义物理设备标准、电气特性,比如网线,光纤等传输介质(比特流  bit  0 1)

TCP/IP模型:应用模型

它是一个应用模型,一共分为5层:

应用层
 HTTP超文本传输协议
HTTPS超文本传输协议(SSL加密算法)
FTP文件传输协议(TCP)
TFTP简单文件传输协议(UDP)
MQTT消息队列遥测传输(物联网协议)
DNS域名解析服务(www.baidu.com转为IP地址)
传输层
TCP传输控制协议
UDP用户数据报协议
网络层
IP协议IPV4IPV6
数据链路层
ARP地址解析协议

                物理层同上:

物理层

定义物理设备标准、电气特性,比如网线,光纤等传输介质(比特流  bit  0 1)

在有一些定义中,也可能是四层:

  • 应用层:同上
  • 传输层:同上
  • 网络层:同上
  • 网络接口层:包含物理层与数据链路层

四、IP协议

网络层

IPv432位
IPv6128位

例:

192.168.1.140         (用户表示形式)   点分十进制   
11000000 10101000 00000000 01000011    (计算机存储形式) 32bits

IP地址

IP地址 = 网络位 + 主机位 

例:192.168.0.121/24
24:网络位的位数

网络位该IP地址位于哪个网段(局域网)内
主机位这个网段(局域网)第几台主机
子网掩码用来区分IP地址的网络位和主机位,搭配IP地址使用。

举个例子:

255.255.255.0
11111111.11111111.11111111.00000000
子网掩码是1的部分对应IP地址的网络位
子网掩码是0的部分对应IP地址的主机位

特殊的IP地址

网段号:IP地址网络位不变,主机位全为0,则为该IP地址的网段号
广播号:IP地址网络位不变,主机位全为1,则为该IP地址的广播号
网关地址:192.168.1.1(局域网与广域网的网关)

举个例子:

IP地址:192.168.1.3

子网掩码:255.255.255.0

网段号:192.168.1.0(网段内的IP能直接通信)

IP地址:192.168.1.3

子网掩码:255.255.255.0

网段号:192.168.1.255(向广播号发送信息,所有局域网内IP都能收到此信息)

IP地址的划分

在此之前,我们先来区分两个概念:

为了节省ip地址,把ip分为两种:

公有IP:由电信公司直接分配,并需要付费的IP地址, 可以直接访问internet
私有IP:不能直接访问internet的ip地址,由路由器分配,进入广域网时自动转为公有IP

(1)A类地址:

用于管理大规模网络

范围1.0.0.0 - 126.255.255.255
子网掩码255.0.0.0
可以分配的IP地址数126*2^24
私有IP地址10.0.0.0 - 10.255.255.255

(2)B类地址:

管理大中规模网络

范围128.0.0.0 - 191.255.255.255
子网掩码255.255.0.0
可以分配的IP地址数2^16
私有IP地址172.16.0.0 - 172.31.255.255

(3)C类地址:

管理中小规模网络

范围192.0.0.0 - 223.255.255.255
子网掩码255.255.255.0
可以分配的IP地址数2^8
私有IP地址192.168.0.0 - 192.168.255.255

(4)D类地址:

组播和广播使用

范围224.0.0.0 - 239.255.255.255

(5)E类地址:

用来进行实验

范围240.0.0.0 - 255.255.255.254

五、 网络端口号

    端口号:为16位的整形数据(unsigned short)(范围是:0-65535)
端口号功能:标记同一主机上的不同网络进程

分类

1)任何TCP/IP实现所提供的服务都用1-1023之间的端口号。

http  80
FTP 20/21
TFPT69
HTTPS443

2)端口号从1024-49151是被注册的端口号,被IANA指定为特殊服务使用。

MQTT:1883/8883

3)从49152-65535是动态或私有端口号。

六、网络配置

1.  ping  ip地址/域名

                查看当前主机和IP/域名所对应的这台主机网络是否联通

2. ifconfig 

                在Linux查看当前主机的IP地址

        ipconfig

                在Windows上查看当前主机的IP地址

 3. 网络配置

 1)虚拟机--》设置--》网络适配器---》桥接模式

 2)编辑--》虚拟网络编辑器--》更改设置--》VMnet0---》桥接至--》当前PC正在上网的网卡上--》应用--》确定

3)修改网络配置文件

                 在终端输入命令:sudo vim /etc/network/interfaces

auto lo
iface lo inet loopbackauto ens33 
iface ens33 inet dhcp

 4)重启网络服务

                sudo /etc/init.d/networking restart

 5) 测试

                ping www.baidu.com

七、网络协议——UDP

UDP:(传输层)用户数据报协议(User Datagram Protocol)

  1)网络编程模型

B/S模型:browser/server(浏览器/服务器)
 1. 客户端是通用的客户端(浏览器)
2. 一般只做服务器开发
 3. 客户端要加载的数据均来自服务器
   C/S模型:client/server(客户端/服务端)
 1. 客户端是一个专用的客户端
2. 服务器和客户端都需开发
3. 客户端可保存资源,本地加载,无需所有数据都请求服务器

 2)UDP编程流程

我们先来厘清一个概念:

套接字:文件描述符;网络通信时,应用层可操作的端口。

socket函数:

       #include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

       int socket(int domain, int type, int protocol);
功能:创建通信的套接字
参数:
domain:网络层使用什么协议族
AF_INET:IPv4
AF_INET6:IPv6
type:规定传输层的协议
SOCK_DGRAM : UDP协议
SOCK_STREAM:TCP协议
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:接收方的地址信息(IP+端口号)
addrlen:接收方地址的大小
返回值:
成功:实际发送的字节数
失败:-1

使用man 7 ip 命令获取两个结构体

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 */};

其中:

port in network byte order代表基于网络字节序的端口号;

网络字节序:大端   (network)
主机字节序:小端   (host)

为了切换这两者,我们可以使用函数:

uint32_t htonl(uint32_t hostlong);          主机转网络
uint16_t htons(uint16_t hostshort);         主机转网络
uint32_t ntohl(uint32_t netlong);           网络转主机
uint16_t ntohs(uint16_t netshort);          网络转主机

我们通常传递的ip地址为一个字符串,为了使其切换成二进制IP地址的形式,也要再调用一次函数:

in_addr_t inet_addr(const char *cp);
功能:
将字符串IP地址转换成二进制IP地址形式

 char *inet_ntoa(struct in_addr in);
功能:
将二进制ip转换成字符串

bind函数:

int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:绑定自己的IP地址和端口号
参数:
sockfd:套接字
addr:需要绑定的地址
addrlen:地址大小
返回值:
成功:0
失败:-1

recvfrom函数:

功能:从套接字上接收数据
参数:
sockfd:套接字
buf:存放接收数据的内存首地址
len:希望接收的字节数
flags:0 :按照默认方式接收(阻塞)
src_addr:发送方的地址信息
addrlen:发送发地址的指针
功能:
成功:实际接收到的字节数
失败:-1

客户端编程:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <sys/types.h>          /* See NOTES */
#include <arpa/inet.h>
#include <unistd.h>int main(int argc, const char *argv[])
{//socket()//sendto()//recvfrom()//close()int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0){perror("socket error");return -1;}//定义的接收方(服务端)的地址变量struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50000);    //接收方的端口号seraddr.sin_addr.s_addr = inet_addr("192.168.0.179");  //接收方所在主机的IP地址char buff[1024] = {0};while (1){fgets(buff, sizeof(buff), stdin);ssize_t cnt = sendto(sockfd, buff, 0, 0, (struct sockaddr *)&seraddr, sizeof(seraddr));if (cnt < 0){perror("sendto error");return -1;}//	printf("cnt = %ld\n", cnt);memset(buff, 0, sizeof(buff));recvfrom(sockfd, buff, sizeof(buff), 0, NULL, NULL);printf("ser-->cli : %s\n", buff);}//close(sockfd);return 0;
}

服务端编程:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <sys/types.h>          /* See NOTES */
#include <arpa/inet.h>
#include <unistd.h>int main(int argc, const char *argv[])
{//socket()//bind()//recvfrom()//sendto()//close()int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0){perror("socket error");return -1;}struct sockaddr_in cliaddr;socklen_t clilen = sizeof(cliaddr);//服务端自己的地址信息变量struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50000);seraddr.sin_addr.s_addr = inet_addr("192.168.0.179");int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if (ret < 0){perror("bind error");return -1;}char buff[1024] = {0};while (1){memset(buff, 0, sizeof(buff));ssize_t cnt = recvfrom(sockfd, buff, sizeof(buff), 0, (struct sockaddr *)&cliaddr, &clilen);if (cnt < 0){perror("recvfrom error");return -1;}else if (0 == cnt){printf("cnt = %ld\n", cnt);break;}printf("[%s : %d][%ld] %s\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port),cnt, buff);fgets(buff, sizeof(buff), stdin);//strcat(buff, "--->ok");sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&cliaddr, clilen);}close(sockfd);return 0;
}

以上就是今天和大家分享的内容!!!!感谢你的阅读!!!!!

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

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

相关文章

遥感机器学习入门实战教程|Sklearn案例⑦:特征选择与重要性分析

很多同学问&#xff1a;波段/特征一多就“维度灾难”&#xff0c;训练慢、过拟合&#xff0c;且很难解释“哪些特征最关键”。本篇用 sklearn 给出一套能跑、可视化、可比较的最小工作流&#xff0c;并配上方法论速记&#xff0c;帮助你在高光谱/多特征任务里做出稳健筛选。 &a…

地理数据制备:蔚蓝地图空气质量数据的获取、清洗与坐标匹配指南

【&#x1f4ca;】手把手攻略&#xff1a;如何从“蔚蓝地图”挖宝——获取济南市可用空气质量数据全记录 一份不需要写代码也能搞定环境数据获取的实用指南 ✨ 引言&#xff1a;为什么选择蔚蓝地图&#xff1f; 作为一名环境数据爱好者&#xff0c;我经常需要获取准确、可靠、…

Unreal Engine USceneComponent

Unreal&#x1f3db; Unreal Engine - USceneComponent&#x1f4da; 定义&#x1f3f7; 类继承⚡ 关键特性⚙️ 常见配置&#x1f6e0;️ 使用方法&#x1f517; 创建与挂载&#x1f504; 获取与修改 Transform&#x1f9e9; 附加/分离组件&#x1f3ca; 典型应用场景&#x1…

2025年9月5090工作站、

在深度学习与大模型训练领域&#xff0c;算力是决定研发效率与模型性能的核心要素&#xff0c;而显卡作为算力输出的核心硬件&#xff0c;其性能参数直接影响着训练任务的速度、稳定性与成本控制。对于企业与科研机构而言&#xff0c;选择一套适配自身需求且性价比优异的显卡及…

亚矩阵云手机:亚马逊第三方店铺多账号安全合规运营的核心技术支撑

亚矩阵云手机在亚马逊第三方店铺多账号安全合规运营的技术支持&#xff0c;通过硬件级虚拟化、AI 行为建模、动态资源调度三大核心技术模块&#xff0c;构建了覆盖设备、网络、行为、数据的四维防御体系&#xff0c;确保账号在亚马逊平台规则下的长期稳定运行。以下从技术架构、…

使用C++11改进工厂方法模式:支持运行时配置的增强实现

在软件开发中&#xff0c;工厂方法模式是一种常用的设计模式&#xff0c;用于创建对象。通过使用C11的新特性&#xff0c;我们可以进一步改进工厂方法模式&#xff0c;使其更加灵活和高效。本文将详细介绍如何使用C11的std::function、lambda表达式和智能指针来实现一个支持运行…

小程序插件使用

插件介绍 插件是对一组 js 接口、自定义组件 或页面的封装&#xff0c;用于嵌入到小程序中使用。插件不能独立运行&#xff0c;必须嵌入在其他小程序中才能被用户使用&#xff1b;而第三方小程序在使用插件时&#xff0c;也无法看到插件的代码。因此&#xff0c;插件适合用来封…

要区分一张图片中的网状图(如网格结构或规则纹理)和噪点(随机分布的干扰像素),比如电路的方法 计算机视觉

要区分一张图片中的网状图&#xff08;如网格结构或规则纹理&#xff09;和噪点&#xff08;随机分布的干扰像素&#xff09;&#xff0c;需结合图像预处理、特征提取和分割算法。以下是系统化的解决方案&#xff0c;分阶段说明关键技术和算法选择&#xff1a; &#x1f50d; 一…

06_并发编程高级特性

第6课:并发编程高级特性 课程目标 掌握context包的使用 理解sync包中的同步原语 学会处理并发安全问题 掌握性能优化技巧 1. Context包 1.1 Context基础 import ("context""fmt""time" )// 基本Context使用 func basicContext()

X00238-非GNSS无人机RGB图像卫星图像视觉定位python

获取方式见文末&#xff0c;可开发票随着无人机在工业和科研领域应用的加速发展&#xff0c;在非城市环境中使用无gnss、基于视觉的方法进行无人机定位的需求日益增长。本文提出了一种基于视觉的定位算法&#xff0c;利用深度特征计算无人机在野外飞行的地理坐标。该方法基于匹…

Eino 开源框架全景解析 - 以“大模型应用的搭积木指南”方式理解

Eino 开源框架全景解析 - 大模型应用的搭积木指南 &#x1f3af; 什么是 Eino&#xff1f;一句话概括 Eino 是字节跳动开源的大语言模型应用开发框架&#xff0c;就像是一个专门为 AI 应用设计的"搭积木工具箱"&#xff0c;让开发者能够像搭乐高一样轻松构建复杂的 A…

嵌入式开发中,usb通信中输出端点和输入端点

一. 简介本文简单学习一下&#xff0c;嵌入式开发中&#xff0c;usb的输出端点和输入端点。在嵌入式开发的 USB 通信场景中&#xff0c;输出端点&#xff08;OUT Endpoint&#xff09; 和 输入端点&#xff08;IN Endpoint&#xff09; 是 USB 设备与主机&#xff08;如电脑、嵌…

【自用】Maven常用依赖

【自用】Maven常用依赖 工具类 Guava Guava&#xff08;Google Guava&#xff09;是由Google团队开发的一套Java开源工具库&#xff0c;旨在简化和增强Java开发者的日常工作。它提供了许多实用的工具和基础设施&#xff0c;覆盖了集合、并发、字符串处理、I/O、数学运算等多个…

Java 18 新特性及具体应用

目录 1. UTF-8 默认编码 (JEP 400) 2. 简单 Web 服务器 (JEP 408) 3. Javadoc 代码片段 (JEP 413) 4. switch 模式匹配 (JEP 420, 第二次预览) 5. 向量 API (JEP 417, 第三次孵化) 总结 Java 18 于 2022 年 3 月发布&#xff0c;引入了多项新特性&#xff0c;旨在提升开发…

unistd.h 常用函数速查表

在这篇文章中&#xff0c;我们将整理一份 unistd.h 常用函数速查表&#xff0c;便于快速查找和记忆&#xff0c;涵盖文件 I/O、进程管理、系统信息、用户/组信息等方面。unistd.h 常用函数速查表&#xff08;POSIX/Linux/macOS&#xff09; 1. 文件与 I/O 操作函数说明示例int …

【电子通识】芯片生产考验“三重门”之CP、FT与WAT测试

在我们日常生活中&#xff0c;从手机、电脑到汽车、家电&#xff0c;都离不开一颗颗小小的芯片。你可曾想过&#xff0c;这些功能强大的芯片在出厂前要经过怎样严苛的“体检”才能保证质量可靠&#xff1f;今天&#xff0c;我们就来聊聊芯片制造过程中三道至关重要的测试关卡&a…

Java RESTful API 构建从入门到精通:一步步打造高效后端服务

还在为高昂的AI开发成本发愁?这本书教你如何在个人电脑上引爆DeepSeek的澎湃算力! 在当今数字化时代,RESTful API 已成为现代Web应用的核心组成部分,它提供了一种标准化、灵活的方式来实现前后端分离和跨平台数据交互。本文作为一篇完整的指南,将从基础概念入手,详细阐述…

TypeScript 接口(interface)

一、接口基础概念接口&#xff08;interface&#xff09;是 TypeScript 的核心类型系统工具&#xff0c;用于定义对象的结构规范。它不关心具体实现细节&#xff0c;只强制要求符合接口定义的对象必须包含指定属性和方法。例如&#xff1a;interface Person {name: string;age:…

selenium3.141.0执行JS无法传递element解决方法

问题&#xff1a;在Chrome 131版本以下执行下面代码没有问题&#xff0c;但是在131版本以上出现element无法传递问题&#xff0c;执行下面代码会出现 "Message: javascript error: Cannot read properties of undefined (reading click)"# xpath匹配元素&#xff0c;…

汽车主机厂为何开始押注平台化视觉?

近年来&#xff0c;随着智能制造、出口质量标准、新能源整车结构复杂度等多重因素叠加&#xff0c;越来越多主机厂开始从“点状部署”转向“系统化导入”&#xff0c;平台化的AI视觉检测体系正逐步成为整车厂的标准化选项。在过去&#xff0c;汽车制造四大车间——焊装、涂装、…