网络、UDP编程

1.网络协议模型:


    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套接字编程:

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


    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 

        inet_addr


        in_addr_t  inet_addr(const char *cp);
        功能:  
            将字符串IP地址转换为内存中的IP地址 

        htons


        uint16_t htons(uint16_t hostshort);


        功能:
            将本地字节序转换为网络的大端字节序
   

 close(sockfd) 关闭套接字

2.收端

        bind 


            int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    功能:
        在套接字上绑定一个IP地址和端口号


    参数:
        sockfd:套接字文件描述符
        addr:绑定IP地址空间首地址
        addrlen:绑定IP地址的长度


    返回值:
        成功返回0 
        失败返回-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 

UDP 基础的发送与接收的例程

        

 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<time.h>
#include<grp.h>#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include<sys/socket.h>
#include<netinet/ip.h>
#include<arpa/inet.h>#define RECV_ADDR "192.168.1.157"
#define RECV_PORT 50000
#endif
send.c
/*************************************************************************> File Name: send.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: 2024年03月06日 星期三 22时06分24秒************************************************************************/#include"head.h"
int main(void)
{int sockfd = 0;        //创建整型sockfd 用来保存socket(套件字)文件描述符 char tmpbuff[1024] = {0};     // 发送的数据ssize_t nsize = 0;            //发送数据的大小struct sockaddr_in recvaddr;   //创建sockaddr_in类型的结构体 recvaddr    用于保存 接收方 的地址信息sockfd = socket(AF_INET,SOCK_DGRAM,0);// AF_INET 表示IPv4 协议  SOCK_DGRAM 表示数据报套接字if(-1 == sockfd){perror("fail to socket");return -1;}recvaddr.sin_family = AF_INET;   //设置接收方地址的地址族 为AF_INET (IPv4)recvaddr.sin_port  = htons(50000); //设置接收方的端口号为50000recvaddr.sin_addr.s_addr = inet_addr("192.168.1.157"); //设置接收方的IP地址为“192.168.1.157” //inet_addr 将ip地址转换为网络字节序gets(tmpbuff);nsize = sendto(sockfd,tmpbuff,strlen(tmpbuff),0,(struct sockaddr *)&recvaddr,sizeof(recvaddr));//sendto将 tmpbuff 中的数据发送给接收方//参数依次是 套接字文件描述符、待发送数据的首地址、发送数据的大小、接收方地址信息的指针、接收方地址信息的大小if(-1 == nsize){perror("fail to sendto");return -1;}close(sockfd);return 0;}

 recv.c

/*************************************************************************> File Name: recv.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: 2024年03月06日 星期三 22时21分52秒************************************************************************/#include"head.h"
int main(void)
{int ret = 0;int sockfd = 0;struct sockaddr_in recvaddr;struct sockaddr_in sendaddr;socklen_t addrlen = sizeof(sendaddr);char tmpbuff[1024] = {0};ssize_t nsize = 0;sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("fail to socket");return -1;}recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = inet_addr("192.168.1.157");
//设置接收方地址的信息,使用bind 将套接字与接收方的地址绑定ret = bind(sockfd,(struct sockaddr *)&recvaddr,sizeof(recvaddr));//bind 参数依次为 套接字文件描述符、指向待绑定地址信息的指针、地址信息的大小if(-1 == ret){perror("fail to bind");return -1;}nsize = recvfrom(sockfd,tmpbuff,sizeof(tmpbuff),0,(struct sockaddr *)&sendaddr,&addrlen);//从套接字接收数据并保存在tmpbuff中//recvfrom参数依次为 套接字文件描述符、接收数据的缓冲区、缓冲区大小、标志位、指向发送方地址信息的指针、地址信息的长度if(-1 == nsize){perror("fail to recvfrom");return -1;}printf("RECV FROM %s:%d>%s\n",inet_ntoa(sendaddr.sin_addr),ntohs(sendaddr.sin_port),tmpbuff);
// 返回发送端的ip地址和端口号close(sockfd);return 0;
}

 makefile  (使用make 一键编译)

all:send recv send:send.c gcc $^ -o $@
recv:recv.c gcc $^ -o $@.PHONY:
clean:rm send recv

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

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

相关文章

gitlab重点知识CI/CD详细步骤说明

介绍 GitHub因其庞大的社区和对开源项目的友好支持而广受欢迎,而GitLab则因其企业级特性和私有仓库的便利性而在企业内部得到广泛应用。 GitLab是一个开源的仓库管理系统,它使用Git作为代码管理工具,并提供了基于Web的服务。 GitLab具有以下特点: 集成了版本控制、持续集…

19.相机,棱镜和光场

一、成像方法 Imaging Synthesis Capture 1.Synthesis&#xff08;图形学上&#xff09;合成&#xff1a;比如之前学过的光线追踪或者光栅化 2.Capture&#xff08;捕捉&#xff09;&#xff1a;把真实世界存在的东西捕捉成为照片 二、相机 1.小孔成像 利用小孔成像的相…

0102全排列和对换-行列式-线性代数

把n个不同的数排成一列&#xff0c;叫做这n个数的全排列&#xff08;排列&#xff09;。 一般情况&#xff0c; 1 , 2 , ⋯ , n 1,2,\cdots,n 1,2,⋯,n是n个数排列的标准次序。 当n个数的任一排列中两个数的先后次序与标准次序不同时&#xff0c;有说有一个逆序。 一个排列中所…

【数据结构】矩阵的压缩存储

矩阵的压缩存储 5.1 普通矩阵的存储 用二维数组存储 分为行优先和列优先&#xff1a; 行优先&#xff1a;优先存放一行的数据。 列优先&#xff1a;优先存放一列的数据。 注意下标是从0还是1开始的&#xff01; 5.2 对称矩阵的存储 对称矩阵定义 若n阶方阵中任意一个元素 a i …

Vue template到render过程

Vue template到render过程 vue的模版编译过程主要如下&#xff1a;template -> ast -> render函数&#xff08;1&#xff09;调用parse方法将template转化为ast&#xff08;抽象语法树&#xff09;&#xff08;2&#xff09;对静态节点做优化&#xff08;3&#xff09;生…

Sqoop “hcatalog does not exist!” 提示信息消除方法

sqoop运行的时候老是有这个报错提示&#xff0c;看着可烦&#xff0c;解决消除一下 解决方法&#xff1a; 1、在$SQOOP_HOME/bin目录下面修改configure-sqoop文件 1&#xff09;进文件夹 cd /training/sqoop-1.4.7/bin2&#xff09;编辑文件 vi /configure-sqoop3&#xff…

K8s Pod控制器

目录 前言&#xff1a; 1.Deployment 查看控制器配置 查看历史版本 2.SatefulSet 安装CoreDNS&#xff0c;仅二进制部署环境需要安装CoreDNS 方法一 方法二 查看statefulset的定义 清单定义StatefulSet 创建pv 定义PV 创建statefulset 滚动更新 总结 扩展伸缩…

【MySQL | 第三篇】MySQL索引及两种索引分类方法总结

文章目录 3.MySQL索引及两种索引分类方法3.1索引的概念3.1.1相关定义3.1.2查询例子 3.2索引的底层3.2.1二叉树&#xff08;1&#xff09;满二叉树&#xff08;2&#xff09;完全二叉树&#xff08;3&#xff09;二叉查找树&#xff08;4&#xff09;二叉平衡树&#xff08;AVL&…

HTML静态网页成品作业(HTML+CSS)——电影网首页网页设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

Vue3_2024_6天【回顾上篇watch常见的前三种场景】另两种待补

第一种情况&#xff1a;监视【ref】定义&#xff08;基本数据类型&#xff09; 1.引入watch2.格式&#xff1a;watch&#xff08;基本数据类型数据&#xff0c;监视变化的回调函数&#xff09; 注意点&#xff1a; 2.1.watch里面第一个参数&#xff0c;是数据~~【监视的基本类…

[Buuctf] [MRCTF2020] Xor

运行 1.查壳 32位exe文件&#xff0c;没有壳 2.用32位IDA打开 找到main函数&#xff0c;F5查看伪代码&#xff0c;但是这里会弹出一个窗口 函数分析失败&#xff01;&#xff01; 这里我在看别人的题解时发现一种玄学方式解决了这个问题 窗口里面弹出了一个地址401095&…

LVS+Keepalived 高可用负载均衡集群

一. 高可用集群的相关知识 1.1 高可用&#xff08;HA&#xff09;集群和普通集群的比较 ① 普通集群 普通的群集的部署是通过一台度器控制调配多台节点服务器进行业务请求的处理&#xff0c;但是仅仅是一台调度器&#xff0c;就会存在极大的单点故障风险&#xff0c;当该调度…

蓝桥杯备赛之二分专题

常用的算法二分模板 1. 在数组a[]中找大于等于x的第一个数的下标 //int ans lower_bound(a, a n, x) - a //相当于下方 int l 0, r n - 1; while(l < r) {int mid l r >> 1;if(a[mid] > x) r mid;else l mid 1; } cout << r;2. 在数组a[]中找大于…

详解Rust的连贯性和孤儿规则

最近学习Rust时候看到两个术语&#xff1a;连贯性(Coherence)和孤儿规则(Orphan rules)&#xff0c;书上解释的不是很清楚&#xff0c;又没有给出具体的代码示例&#xff0c;让人很难理解。我在网上搜了好久&#xff0c;最后又查了Rust语言规范&#xff0c;算是搞明白了这两个概…

qml中toolbox控件、ComboBox控件、PlainText实现及美化

一. 内容简介 qml中toolbox控件、ComboBox控件、PlainText实现及美化 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3pytorch 安装pytorch(http://t.csdnimg.cn/GVP23) 2.4QT 5.14.1 新版QT6.4,&#xff0c;6.5在线安装经常失败&#xff0c;而5.9版本…

[蓝桥杯 2019 省 B] 等差数列

题目链接 [蓝桥杯 2019 省 B] 等差数列 题目描述 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列&#xff0c;只记得其中 N N N 个整数。 现在给出这 N N N 个整数&#xff0c;小明想知道包含这 N N N 个整数的最短的等差数列有几项&#x…

亚马逊运营要使用什么海外代理IP?

代理IP作为网络活动的有力工具&#xff0c;同时也是跨境电商的必备神器。亚马逊作为跨境电商的头部平台&#xff0c;吸引了大量的跨境电商玩家入驻&#xff0c;想要做好亚马逊&#xff0c;养号、测评都需要代理IP的帮助。那么应该使用什么代理IP呢&#xff1f;如何使用&#xf…

复杂系统未来演化很难准确预测

复杂系统的未来演化很难准确预测。这是由于复杂系统包含大量相互作用的组成部分&#xff0c;其行为和发展受到多种因素的影响&#xff0c;包括内部动力、外部环境变化以及意外事件等。此外&#xff0c;复杂系统通常呈现非线性关系&#xff0c;即系统的变化可能以不可预测的方式…

JS-02-javaScript快速入门

一、javaScript代码的编写位置 JavaScript代码可以直接嵌在网页的任何地方&#xff0c;但是一般&#xff0c;我们用如下编写方式。 1-1、直接写到HTML文件中 通常我们都把JavaScript代码放到<head>中&#xff0c;由<script>...</script>包含的代码就是Java…

【深度学习】1. 深度学习概述

感知器模型 人脑中的神经元:一个神经元通常具有多个树突&#xff0c;主要用来接受传入信息;而轴突只有一条&#xff0c;轴突尾端有许多轴突末梢可以给其他多个神经元传递信息。轴突末梢跟其他神经元的树突产生连接&#xff0c;从而传递信号。 而在计算机的神经网络中&#xff…