当前位置: 首页 > java >正文

linux下的网络编程

一、网络编程

        Linux 下的网络编程,核心是基于 TCP/IP 协议栈,通过操作系统提供的 Socket(套接字)API 实现网络通信,支持客户端与服务器间的数据传输,广泛用于开发服务器、客户端、网络工具等应用。

        1.目的

                不同主机,进程间通信;

        2.问题

        (1)主机与主机之间物理层面必须互联互通;

        (2)进程与进程在软件层面必须互联互通;

       

         广域网与局域网

广域网:覆盖范围广(如城市、国家、全球),依赖运营商专线、卫星等长途传输技术,连接多个局域网,传输速度相对较慢、延迟较高,典型代表是互联网,用于跨区域的数据交互;

局域网:覆盖范围小(如家庭、办公室、校园),采用交换机、路由器等设备连接,传输速度快、延迟低、安全性较高,常用于局部区域内设备(电脑、打印机等)的互联。

交换机与互联网

IP地址:计算机的软件地址,用来标识计算机设备;

MAC地址:计算机的硬件地址;

网络的端口号:标记同一主机上的不同网络进程;

       3.网络协议

        网络通信标准

       1) 0SI七层模型:开放系统互联模型(open system interconnect)【理论模型】

                不同设备间的网络通信的通信标准;

     应用层
     表示层
     会话层
     传输层
     网络层
  数据链路层
     物理层

                (1)应用层:要传输的数据信息,如文件传输,电子邮件;

                (2)表示层:数据加密,解密,压缩,解压缩;

                (3)会话层:建立数据传输通道----->会话;

                (4)传输层:传输的方式  UDP  TCP   端口号;

                (5)网络层:实现数据路由  路径规划  路由器  ip;

                (6)数据链路层:封装成帧,点对点通信(居于网内通信),差错检测  交换机   ARP;

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

        2)TCP/IP模型:【应用模型】

        五层:

                <1>应用层:

                        HTTP:超文本传输协议

                        HTTPS:超文本传输协议(SSL加密算法)

                        FTP:文件传输协议(TCP)

                        TFTP:简单文件传输协议(UDP)

                        MQTT:消息队列遥测传输协议(物联网协议)(节省带宽)

                        DNS:域名解析服务,域名转为成IP地址

                <2>传输层:

                        TCP:传输控制协议(确定唯一路径)

                        UDP:用户数据报协议(数据丢失)

                <3>网络层:

                        IP协议

                        192.168.1.128

                        IPV4:32位

                        IPV6:128位

                        

                        192.168.0.142(用户表示形式)点分十进制

                        IP地址 = 网络位 + 主机位

                        

                        子网掩码:
如:255.255.255.0
11111111.11111111.11111111.00000000
用来区分IP地址的网络位和主机位,搭配IP地址使用。
子网掩码是1的部分对应IP地址的网络位
子网掩码是0的部分对应IP地址的主机位

                        网段号:

                        ip地址网络位不变,主机位全为0,则该IP地址的网段号

                广播号

                192.168.1.255

                ip地址网络位不变,主机位全为1,则该IP地址的广播号

                

                网关地址   : 192.168.1.1

        IP地址划分:(A)同于管理大规模网络;

                              (B)用于管理中大规模网络;

                              (C)用于管理中小规模网络;

                              (D)组播与广播;

                              (E)用来实验;

       

           

                <4>数据链路层:

                        ARP:地址解析协议

                <5>物理层:设备特征等

        四层:

                应用层:同上;

                传输层:同上;

                网络层:同上;

                网络接口层:合并数据链路层和物理层;

5.网络端口号

端口号:16位的整型数据(unsigned short)0--65535

端口号功能:标记同一主机的不同网络进程

分类:

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

                http:80;

                FTP:20/21

                TFTP:69

                HTTPS:443

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

                MQTT:1883/8883

6.网络配置

        (1)ping  ip地址/域名

                查看当前主机和ip地址是否联通

        (2)ifconfig

                在linux下查看当前主机IP地址

                

                在windows下查看当前主机IP地址

7.用户数据协议--UDP

        UDP:传输层

                用户数据报协议

        1)网络编程模型

                B/S:browser/server(浏览器/服务器)

                1.客户端是一个通用的客户端;

                2.只做服务器的开发;

                3.客户端要加载的数据均来自服务器;

                C/S:client/server(客户端/服务端)

                1.客户端是一个专用的客户端;

                2.服务器和客户端都需开发;

                3.客户端可保存资源,本地加载,无需所有数据都请求服务器;

        2)UDP编程

                套接字:文件描述符

                                网络通信时,应用层可操作的端口

客户端  :sendto()--->recvfrom()----->close()

服务端  : bind()----->recvform---->  sendto----->close()

        UDP特点:UDP:无连接、不可靠、数据报协议(如 DNS、视频流),无需建立连接,传输效率高,但可能丢包或乱序。

UDP函数:

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

       i(1)nt socket(int domain, int type, int protocol);

功能·:创建通信的套接字;

参数:

        domain:网络层使用什么协议族

        AF_INET             IPv4 Internet protocols         
AF_INET6            IPv6 Internet protocols    

        type:规定传输层的协议

        SOCK_DGRAM  :UDP协议;

        SOCK_STREAM:TCP协议;

        SOCK_RAW:原始套接字

        protocol:0 按照默认协议创建;

返回值:

        成功:套接字

        失败:-1

(2)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:按照默认方式发送;

        deat_addr:接收方的地址信息(IP+端口号);

        addrlen:接收方地址的大小;

返回值:

        成功:实际发送的字节数;

        失败:-1;

下列函数是Linux 网络编程中核心的字节序转换函数,主要用于解决不同主机间数据传输的 “字节序不一致” 问题,确保数据在网络中正确解析:host:主机   network:网络

uint32_t htonl(uint32_t hostlong);          主机转网络  host ----->network  4
uint16_t htons(uint16_t hostshort);         主机转网络 host ----->network  2
uint32_t ntohl(uint32_t netlong);           网络转主机   network----->host  4
uint16_t ntohs(uint16_t netshort);          网络转主机  network----->host  2

其中

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

 

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

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

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

      (4) int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:绑定自己的IP地址和端口号

参数:

        sockfd:套接字;

        addr:需要绑定的地址;

        addrlen:绑定地址的大小;

返回值:

        成功:0;

        失败:-1

(5) ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);

功能:从套接字上接收数据

参数:

        sockfd:套接字;

        buf:存放接受数据的内存首地址;

        len:希望接受的字节数;

        flags:0:按照默认方式收到(阻塞);

        src_addr:发送发地址的指针;

返回值:

        成功:接受的字节数;

        失败:-1

http://www.xdnf.cn/news/18519.html

相关文章:

  • 快速入门Vue3——初体验
  • 6020角度双环控制一种用于电机控制的策略
  • 智能合约漏洞检测技术综述:守护区块链世界的“自动售货机”
  • 在通义灵码中配置MCP服务
  • uniapp使用map打包app后自定义气泡不显示解决方法customCallout
  • JavaWeb前端05(Vue工程化,Vue组件两种风格:组合式API 和 选项式API)及简单案例)
  • 豆包 + 蘑兔,破解写歌难题!
  • 知识蒸馏 Knowledge Distillation 论文 Generalized Knowledge Distillation (GKD) 目标函数的演化
  • 【Cmake】Cmake概览
  • 使用GMail API 发送邮箱
  • OpenSCA开源社区每日安全漏洞及投毒情报资讯|21th Aug. , 2025
  • 前端github-workflows部署腾讯云轻量服务器
  • 实用R语言机器学习指南:从数据预处理到模型实战(附配套学习资源)
  • docker 查看容器 docker 筛选容器
  • 循环神经网络实战:GRU 对比 LSTM 的中文情感分析(三)
  • Flask数据库迁移实战指南
  • LeetCode100-76最小覆盖子串
  • 数据库备份sql文件过大,phpAdmin无法执行Sql
  • Python递归下降解析器深度解析:从原理到工程实践
  • 异常值检测:孤立森林模型(IsolationForest)总结
  • Flowise 任意文件上传漏洞 含Flowise Docker安装、漏洞复现(CVE-2025-26319)
  • 如何使用 DeepSeek 助力工作:全面指南​
  • AWS OpenSearch 是什么
  • ROS2下YOLO+Moveit+PCL机械臂自主避障抓取方案
  • 如何理解AP服务发现协议中“如果某项服务需要被配置为可通过多个不同的网络接口进行访问,则应为每个网络接口使用一个独立的客户端服务实例”?
  • Unreal Engine APawn 与 ACharacter 比较
  • 停车场道闸的常见形式
  • Docker的安装
  • 什么是数据分类分级?数据分类分级技术实现路径及产品推荐
  • 逆向代码笔记