Linux下的网络编程

1. 目的

实现不同主机之间进程的通信。

2. 问题
  1. 主机之间在物理层面必须互联互通。
  2. 进程之间在软件层面必须互联互通。
    • IP地址:计算机的软件地址,用于标识计算机设备。
    • MAC地址:计算机的硬件地址(固定)。
    • 网络的端口号:标记同一主机上的不同网络进程。
3. 网络协议

网络通信标准。

  • OSI七层模型(理论模型):开放系统互连模型,是不同体系结构设备间网络通信的通信标准。
    • 应用层:要传输的数据,如文件传输、电子邮件。
    • 表示层:数据加密解密操作、压缩解压缩操作。
    • 会话层:建立数据传输通道。
    • 传输层:传输的方式,如UDP、TCP、端口号。
    • 网络层:实现数据路由,如路由器、IP。
    • 数据链路层:封装成帧、点对点通信(局域网内通信)、差错检测,如交换机。
    • 物理层:定义物理设备标准、电气特性,如网线、光纤等传输介质,比特流(bit 0/1)。
  • TCP/IP模型(应用模型):
    • 五层:
      • 应用层:
        • HTTP:超文本(数据类型较多)传输协议。
        • HTTPS:超文本传输协议(SSL加密算法)。
        • FTP:文件传输协议(TCP传输)。
        • TFTP:简单文件传输协议(UDP传输)。
        • MQTT:消息队列遥测传输协议(广泛应用于物联网协议传输)。
        • DNS:域名解析服务(将一个域名转换为IP地址)。
      • 传输层:
        • TCP:传输控制协议(构建路径)。
        • UDP:用户数据报协议(传输时不构建路径,找效率高的,可能导致乱序;不安全,可能会导致丢包)。
      • 网络层:
        • IP协议:
          • IPv4。
          • IPv6。
      • 数据链路层:
        • ARP:地址解析协议(IP地址和MAC地址之间的转换)。
      • 物理层。
    • 四层:
      • 应用层。
      • 传输层。
      • 网络层。
      • 网络接口层。
4. IP协议

网络层协议。

  • IPv4:32位(用ipconfig在Windows终端上查看)。
  • IPv6:128位。
  • IP地址 = 网络位 + 主机位,和子网掩码搭配使用,子网掩码全为1的是网络位,全为0的是主机位。
    • 示例:192.168.0.121/24(24表示网络位的位数)。
    • 网络位:标识该IP地址所在的网段(局域网)。
    • 主机位:标识该网段中的具体主机。
    • 网段号:如192.168.1.0(网络位保留,主机位为0)。
    • 广播号:如192.168.1.255(网络位不变,主机位全为1)。
    • 网关地址:如192.168.1.1(网络位保留,主机位为1)。
  • IP地址划分:
    1. A类地址:
      • 范围:1.0.0.0 - 126.255.255.255。
      • 子网掩码:255.0.0.0。
      • 主机数量:2^24(大规模网络)。
      • 私有IP地址:10.0.0.0 - 10.255.255.255。
      • 回环地址:127.0.0.0。
    2. B类地址:
      • 范围:128.0.0.0 - 191.255.255.255。
      • 子网掩码:255.255.0.0。
      • 主机数量: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。
      • 主机数量: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(用于实验)。
  • 共用IP:由电信公司直接分配,需要付费的IP地址,可以直接访问Internet。
  • 私有IP:不能直接访问Internet的IP地址,由路由器转为共用IP。
  • 这样可以节省IP地址。
5. 网络端口号

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

  1. 任何TCP/IP实现所提供的服务都用1 - 1023之间的端口号。
    • HTTP:80。
    • FTP:20/21。
    • TFTP:69。
    • HTTPS:443。
    • MQTT:1883/8883。
  2. 端口号从1024 - 49151是被注册的端口号,被IANA指定为特殊(如MQTT:1883/8883)。
  3. 从49152 - 65535是动态或私有端口号。
  4. 数据包封装与解封过程
6. 网络配置
  1. ping ip地址/域名:查看当前主机和IP/域名所对应的网络是否联通,例如ping www.baidu.com
  2. ifconfig
    • Linux上查看IP地址。
    • Windows上使用ipconfig
  3. 网络配置步骤:
    1. 虚拟机->设置->网络适配器->桥接模式。
    2. 编辑->虚拟网络编辑器->更改设置->VMnet0->桥接至->当前上网的网卡->应用。
    3. 修改网络配置文件:
      sudo vim /etc/network/interfaces
      

      内容改为:
      auto lo
      iface lo inet loopback
      auto ens33
      iface ens33 inet dhcp
      

    4. 重启网络服务:
      sudo /etc/init.d/networking restart
      

    5. 测试:
      ping www.baidu.com
      

7. 网络层-UDP

在传输层(用户数据报协议User Datagram Protocol)。

  1. 网络编程模型:
    • B/S模型:browser(浏览器)/server(服务器)。
      • 客户端是一个通用的客户端(浏览器)。
      • 一般只做服务器开发。
      • 客户端要加载的数据均来自服务器。
    • C/S模型:client(客户端)/server(服务端)。
      • 客户端是一个专用的客户端。
      • 服务器和客户端都需开发。
      • 客户端保存资源,本地加载,无需所有数据都请求服务器。
  2. 编程:
    • 客户端:
      • socket():创建通信的套接字(文件描述符,网络通信时应用层可操作的端口)。
      • sendto():发送数据。
      • recvfrom():接受数据。
      • close():关闭套接字。
    • 服务端:
      • socket():创建通信的套接字。
      • bind():绑定服务器的IP和端口。
      • sendto():发送数据。
      • recvfrom():接受数据。
      • close():关闭套接字。
  3. 相关函数:
    • 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:接收方地址的大小。
      • 返回值:成功返回实际发送的字节数。

        3.

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

        4.

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

        5.

网络字节序:大端                network
主机字节序:小端  50000   host
        8.代码

                UDP相关编程

客户端

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>int main(int argc, char const *argv[])
{int sockfd = socket(AF_INET, SOCK_DGRAM, 0);//man 7 ip/创建套接字(网络类型;UDP;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地址// while(1)// {//     ssize_t cnt = sendto(sockfd, "1111", 13, 0, (struct sockaddr *)&seraddr, sizeof(seraddr));//发送// }char buff[1024] = {0};while(1){fgets(buff,sizeof(buff),stdin);ssize_t cnt = sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&seraddr, sizeof(seraddr));//发送if(cnt < 0){perror("sendto error");return -1;}printf("cnt = %ld\n", cnt);}close(sockfd);//关闭return 0;
}

服务端

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>int main(int argc, char const *argv[])
{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.192");int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if(ret < 0){perror("bind error");return -1;}char buff[1024] = {0};while(1){ssize_t cnt = recvfrom(sockfd, buff, sizeof(buff), 0, NULL, NULL);if(cnt < 0){perror("recvfrom error");return -1;}printf("cnt = %ld, buff = %s\n", cnt, buff);memset(buff, 0, sizeof(buff));}close(sockfd);return 0;
}

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

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

相关文章

排序(数据结构)

比较排序 插入排序&#xff08;斗地主摸牌就是一个插入排序&#xff09; 单纯的插入排序也叫直接插入排序 时间复杂度&#xff1a; 最好O(n)最坏O(n^2) 过程 先写单趟&#xff0c;再写整体 依次比较&#xff0c;如果大于就往后挪动&#xff0c;否则就退出循环&#xff0c;插入数…

【C++组件】Elasticsearch 安装及使用

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;C框架/库 目录&#x1f525; 介绍 &#x1f525; ES 安装 &#x1f98b; 安装 kibana&#x1f98b; ES 客户端的安装&#x1f525; ES 核心概念 &#x1f98b; 索引&#xff08;Index&#xff09;&…

项目:电动车报警器

1.项目需求 点击遥控器A按键&#xff0c;系统进入警戒模式&#xff0c;一旦检测到震动(小偷偷车)&#xff0c;则喇叭发出声响报警&#xff0c;吓退小偷。 点击遥控器B按键&#xff0c;系统退出警戒模式&#xff0c;再怎么摇晃系统都不会报警&#xff0c;否则系统一直发出尖叫&a…

GDSFactory环境配置(PyCharm+Git+KLayout)

1、安装 PyCharm 和 KLayout 安装 PyCharm&#xff08;官网社区版即可&#xff09;和 KLayout&#xff08;官网最新版&#xff09;&#xff0c;这两款软件均开源&#xff0c;安装操作简单&#xff0c;这里不再赘述。&#xff08;注意&#xff1a;PyCharm软件是否安装成功以能否…

STM32 定时器(输出模式)

⚙️ ​一、输出模式总览​STM32定时器的输出比较模式通过比较计数器&#xff08;CNT&#xff09;与捕获/比较寄存器&#xff08;CCRx&#xff09;的值&#xff0c;控制输出引脚&#xff08;OCx&#xff09;的电平状态。六种模式定义如下&#xff1a;​模式宏​​触发动作​&am…

嵌入式硬件篇---手柄

手柄原理&#xff1a;手柄遥控的原理其实可以简单理解为 “信号的发送与接收”&#xff0c;就像两个人用对讲机聊天&#xff0c;一方说话&#xff08;发送信号&#xff09;&#xff0c;另一方听话&#xff08;接收信号&#xff09;&#xff0c;然后根据内容行动。下面用通俗的方…

数据库架构开发知识库体系

摘要面向初创与企业团队&#xff0c;系统梳理数据库与数据平台从采集、传输、存储、处理、服务化到治理与安全的全链路。覆盖 OLTP/OLAP/HTAP、湖仓一体与实时数据栈&#xff0c;结合国内外工具与方法论&#xff0c;给出架构选型、性能优化、可靠性与合规要点&#xff0c;以及可…

在Excel和WPS表格中合并多个单元格这样最快

如果要把WPS表格和Excel中多个单元格的数据合成到一个单元格中&#xff0c;不用函数&#xff0c;只需要先写输入公式&#xff0c;然后在各个单元格之间输入&符号即可。&#xff08;当然&#xff0c;&符号不只是连接单元格的数据&#xff0c;也可以直接输入内容连接&…

在嵌入式上用 C++14实现简单HSM状态机

文章目录概述为什么要迁移到 C&#xff0c;以及 C 的陷阱目标与挑战为什么不能直接使用 std::function&#xff1f;解决方案&#xff1a;POD 回调与模板 Trampoline核心设计模板 trampoline 实现两种成员函数绑定策略1. **Per-Transition Context&#xff08;每个状态转移绑定一…

【unity】Obfuz加固混淆日志还原解析方案ObfuzResolver

Github | Gitee ObfuzResolver是基于obfuz-tools针对Obfuz的一项辅助工具&#xff0c;方便开发者在unity编辑器中或者运行时快捷将使用Obfuz混淆加固后的日志信息还原为原始信息&#xff0c;以辅助开发者快速定位Bug。 特性 支持unity编辑器模式下还原被加固混淆的日志信息&a…

2025DevOps平台趋势解读:哪些DevOps工具正在引领行业变革?

DevOps平台已成为企业提升研发效能、实现敏捷交付的核心支柱。2025年DevOps领域正经历深刻变革&#xff0c;平台能力正从“工具链整合”向“价值流智能中枢”跃升。01. 2025Devops平台趋势解读“全栈式”与“模块化/可组合”的平衡&#xff1a;企业既需要能覆盖开发、测试、部署…

第二阶段Winform-4:MDI窗口,布局控件,分页

1_MDI窗口 &#xff08;1&#xff09;MDI是指将多控件窗体在同一窗体中打开,可以设置重叠打开&#xff0c;平捕打开等&#xff0c;MDI窗体&#xff08;Multiple-Document Interface&#xff0c;多文档界面&#xff09;用于同时显示多个文档。在项目中使用MDI窗体时&#xff0c…

实用R语言机器学习指南:从数据预处理到模型实战(附配套学习资源)

一、为什么需要掌握机器学习建模&#xff1f;在科研与项目实践中&#xff0c;机器学习已成为数据挖掘的核心工具。本文手把手带你在R语言中实现7大常用模型&#xff1a;逻辑回归/正则化回归决策树/随机森林SVM支持向量机XGBoost梯度提升神经网络全程包含数据标准化→模型训练→…

go.uber.org/zap 日志库高性能写入

使用 go.uber.org/zap 实现日志分割功能 实现按照单个文件最大MB自动分割,最多保留多少天的文件,是否启用压缩,按天自动分割日志 核心依赖 go.uber.org/zap:核心日志库 lumberjack.v2:日志轮转工具(实现按大小/时间分割) 时间处理依赖标准库 time 实现步骤 1. 初始化…

电脑端完全免费的动态壁纸和屏保软件(真正免费、无广告、无会员)

✅ 1. Lively Wallpaper&#xff08;强烈推荐&#xff09; 特点&#xff1a;完全免费、开源、无广告&#xff0c;支持本地视频/GIF/网页作为动态壁纸内置资源&#xff1a;12个高质量动态壁纸&#xff08;可自定义&#xff09;屏保功能&#xff1a;支持将动态壁纸一键设为屏保系…

C#_组合优于继承的实际应用

2.2 Composition over Inheritance&#xff1a;组合优于继承的实际应用 继承&#xff08;Inheritance&#xff09;是面向对象编程中最容易被过度使用和误用的特性之一。传统的教学往往让人们优先选择继承来实现代码复用和建立“是一个&#xff08;is-a&#xff09;”的关系。然…

Kafka消息丢失的场景有哪些

生产者在生产过程中的消息丢失 broker在故障后的消息丢失 消费者在消费过程中的消息丢失ACK机制 ack有3个可选值&#xff0c;分别是1&#xff0c;0&#xff0c;-1。 ack0&#xff1a;生产者在生产过程中的消息丢失 简单来说就是&#xff0c;producer发送一次就不再发送了&#…

盼之代售 231滑块 csessionid 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 部分python代码 url "…

STL关联式容器解析:map与set详解

目录 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 3.1 set 3.1.2 set的使用 3.2 map 3.2.1 map的介绍 3.2.2 map的使用 3.3 multiset 3.3.1 multiset的介绍 3.3.2 multiset的使用 3.4 multimap 3.4.1 multimap的介绍 3.4.2 multimap的使用 4.红黑树模拟实现…

贪吃蛇--C++实战项目(零基础)

视频地址&#xff1a;C语言必学项目&#xff1a;贪吃蛇&#xff01; 贪吃蛇游戏框架 ├── 基础框架 │ ├── 头文件引入 │ ├── 常量和宏定义 │ └── 窗口初始化 │ ├── 数据结构系统 │ ├── Pos结构体(位置和颜色) │ ├── Snake结构体(蛇的属性) │ ├──…