网络编程 UDP编程 Linux环境 C语言实现

news2024/11/8 10:41:44

UDP编程

1. 一般UDP编程

UDP传输特点:非面向连接、不可靠的、无序的 报式传输 支持组播和广播

UDP应用数据最大长度建议:MTU(以太网分组数据的最大长度)1500 - 20(IP头) - 8(UDP头) = 1472Bytes

客户端:支持两种形式的代码编写:

1. 不定向传输

2. 定向传输 ------ 只与指定的服务端进行UDP数据交互

新函数:


2. IP地址分类

以下特殊IP地址去除掉:

  1. IP地址4个字节全0
  2. IP地址4个字节全1
  3. ABC三类IP地址中主机号全0
  4. ABC三类IP地址中主机号全1
  5. A类中127.开头的IP地址

剩余的A、B、C三类IP地址,才能作为因特网上的某台主机的IP地址用,这些IP地址再被分为两大类:

1. 用于边缘网络:A类的10.x.x.x B类的172.16.x.x C类的192.168.0.x ~ 192.168.255.x

2. 用于核心网络:剩余的才能作为核心网上主机的IP地址用


3. UDP广播


4. UDP组播


本地Socket

采用带路径的socket文件名作为服务端进程的身份标识:

专用socket地址结构体:

struct sockaddr_un{

        sa_family_t sun_family;//固定为AF_UNIX 或 AF_LOCAL

        char sun_path[108];

};

socket函数的第一个参数传AF_UNIXAF_LOCAL

其它接口使用同TCP


示例代码:

send.c

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[]){
        int sockfd = -1; 
        struct sockaddr_in servaddr;
        int on = 1;

        /*1. 为了后续的UDP传输创建一个引擎对象,并获得该引擎对象的描述符*/
        sockfd = socket(AF_INET,SOCK_DGRAM,0);

        /*2. 允许使用指定socket描述符发送广播数据*/
        setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
    
        /*3. 填写目标网络的广播地址和端口号*/
        bzero(&servaddr,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(9898);
        //inet_aton("255.255.255.255",&servaddr.sin_addr);
        inet_aton("172.16.181.128",&servaddr.sin_addr);

        /*3.发送广播数据*/
        sendto(sockfd,"hello",6,0,(struct sockaddr *)&servaddr,sizeof(servaddr));

        /*4. 无需继续发送广播数据时,及时关闭描述符*/
        close(sockfd);
        sockfd = -1; 
        return 0;
}

​recv.c

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>

#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[]){
        int sockfd = -1; 
        struct sockaddr_in servaddr;
        int ret = 0;

        /*1. 为了后续的UDP传输创建一个引擎对象,并获得该引擎对象的描述符*/
        sockfd = socket(AF_INET,SOCK_DGRAM,0);
    
        /*2. 填写服务端的IP和端口号*/
        bzero(&servaddr,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(9898);
        //inet_aton("0.0.0.0",&servaddr.sin_addr);
        inet_aton("172.16.181.128",&servaddr.sin_addr);

        /*3. 为服务端UDP socket引擎对象指定IP地址和端口号*/
        ret = bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
        if(ret){
                printf("In Server,bind failed\n");
                close(sockfd);
                sockfd = -1; 
                return 1;
        }

        /*4. 接收广播数据*/
        {
                char buf[8] = ""; 
                struct sockaddr_in cliaddr;
                socklen_t socklen = sizeof(cliaddr);

                recvfrom(sockfd,buf,8,0,(struct sockaddr *)&cliaddr,&socklen);
                printf("In Server,buf=%s\n",buf);
                printf("In Server,client port = %d\n",cliaddr.sin_port);
                printf("In Server,client ip = %s\n",inet_ntoa(cliaddr.sin_addr));
        }

        /*5. 无需继续接收广播数据时,及时关闭描述符*/
        close(sockfd);
        sockfd = -1; 
        return 0;
}

p.s. aton" 172.16.181.128 " 是从 ifconfig 命令中获取


输出:

先运行 recv.c 

新建标签页,运行 send.c 

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

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

相关文章

高压线路覆冰厚度测量,输电线路微波覆冰监测装置守护电网安全

随着北方地区正式步入冬季&#xff0c;气温急剧下降&#xff0c;高压线路覆冰现象日益严重&#xff0c;给电网安全带来了前所未有的挑战。近日&#xff0c;在东北某省&#xff0c;由于连续低温天气&#xff0c;多条高压线路遭受了严重的覆冰侵袭&#xff0c;这不仅极大地加重了…

Java面试经典 150 题.P88. 合并两个有序数组(001)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解 class Solution {public void merge(int[] nums1, int m, int[] nums2, …

基于安卓Android的健身系统APP(源码+文档+部署+讲解)

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 选题不知道怎么选 不清楚自己适合做哪块内容 都可以免费来问我 会持续一直更新下去 有问必答 一键收藏关注不迷路 源码获取&#xff1a;https://pan.baidu.…

中电信翼康工程师:我在 Apache SeaTunnel 社区的贡献之旅

贡献者Github ID&#xff1a;luckyLJY 文章整理&#xff1a;曾辉 Apache SeaTunnel 作为一款强大的数据同步和转换工具&#xff0c;凭借其部署易用性、容错机制、数据源支持、性能优势、功能丰富性以及活跃的社区支持&#xff0c;成为了数据工程师们不可或缺的利器。 因其具有的…

offset Explorer连接云服务上的kafka连接不上

以上配置后报连接错误时&#xff0c;可能是因为kafka的server.properties配置文件没配置好&#xff1a; 加上面两条配置&#xff0c;再次测试连接&#xff0c;成功 listeners和advertised.listeners

使用Python来下一场雪

具体效果&#xff1a;&#xff08;大雪缓缓下落&#xff09; 完整代码&#xff1a; import pygame import random# 初始化 Pygame pygame.init()# 设置窗口 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption("下雪…

k8s 1.28.2 集群部署 Thanos 对接 MinIO 实现 Prometheus 数据长期存储

文章目录 [toc]什么是 ThanosThanos 的主要功能Thanos 的架构组件Thanos 部署架构SidecarReceive架构选择 开始部署部署架构创建 namespacenode-exporter 部署kube-state-metrics 部署Prometheus Thanos-Sidecar 部署固定节点创建 label生成 secretMinIO 配置etcd 证书 启动 P…

13、基于AT89C52轮询方式扫描按键proteus仿真

一、仿真原理图: 二、仿真效果: 三、相关代码: 1、main主函数: void main(void) { unsigned char ll; VariableInit(); while(1) { value = keyScan(); display(); …

春季测试 2023 我的题解

T1 涂色游戏 这道题目还是比较简单的 容易发现&#xff0c;位于 ( x i , y i ) (x_i,y_i) (xi​,yi​) 的格子的颜色只取决于 ​ x i x_i xi​ 行与 y i y_i yi​ 列的颜色。 这时候可以想到开两个数组&#xff0c;分别存储列与行的绘画信息&#xff0c;然后发现前后的互相…

magic-api简单使用二:自定义返回结果

背景 在上一章 中我们学习了搭建项目和导入文件&#xff0c; 这二天稍微有点时间&#xff0c;研究下这个magic-api的写法。 后续如果需要维护或者更改&#xff0c;也能在项目中尽快上手。 今天我们主要学习自定义返回结果&#xff0c;当然也可以使用官方的。不需要任何更改。…

“启动智能制造引擎 推动新质生产力发展”高峰论坛在京成功举办

在智能制造技术的助力下,北京经开区的智能制造产业稳步发展。2024年10月25日,北京电子科技职业学院图书馆暨北京经济技术开发区公共图书馆举办一场以“启动智能制造引擎 推动新质生产力发展”为主题的高峰论坛于北京亦庄经开区盛元书院圆满落幕。此次论坛为北京经开区智能制造产…

Java 异常处理(6/30)

目录 Java 异常处理 1. 什么是异常 2. 异常处理的关键字 2.1 try-catch 语句 2.2 多个 catch 块 2.3 finally 块 2.4 throw 和 throws 3. 自定义异常 4. 异常处理的最佳实践 总结与后续 Java 异常处理 在软件开发中&#xff0c;异常处理&#xff08;Exception Handl…

ubuntu22.04安装向日葵

1、下载deb安装包 进入官网下载图形版本&#xff1a;https://sunlogin.oray.com/download/linux?typepersonal 2、命令行安装 sudo chmod x 文件名.deb sudo dpkg -i 文件名.deb 3、开始报错的看这里&#xff01; 首先展示一下安装成功的效果图&#xff1a; 接下来是我安…

小米手机投屏到Windows笔记本电脑的3个方法,随便选一个

方法一&#xff1a;Windows系统自带的投屏功能 Windows系统本身的功能很多&#xff0c;其中一项就是接收别的电脑或手机的投屏。 操作步骤一&#xff0c;在Windows电脑里进入【设置】&#xff0c;点击【系统】&#xff0c;往下翻页&#xff0c;找到【投影到此电脑】。 如果这…

漏洞挖掘 | 通过域混淆绕过实现账户接管

由于这是一个私有项目&#xff0c;我将使用 example.com 来代替。 很长一段时间以来&#xff0c;我一直想在漏洞赏金项目中找到一个账户接管&#xff08;ATO&#xff09;漏洞。于是&#xff0c;我开始探索项目范围内的 account.example.com。 我做的第一件事就是注册一个新账…

加密软件有什么功能?

加密软件是一种专门用于保护数据安全的工具&#xff0c;它通过复杂的加密算法来确保数据在传输和存储过程中的机密性和完整性。以下是加密软件通常具备的主要功能&#xff1a; 一、数据加密 文件加密&#xff1a;能够对单个文件或整个文件夹进行加密&#xff0c;确保只有授权…

Python bs4 结合 Scrapy,进行数据爬取和处理

Python bs4 结合 Scrapy&#xff0c;进行数据爬取和处理 在现代数据分析和机器学习领域&#xff0c;数据爬取是获取网页数据的常用方法。Python 提供了许多工具来进行网页爬取&#xff0c;其中 Scrapy 和 BeautifulSoup&#xff08;bs4&#xff09;是最常用的两个库。Scrapy 是…

【p2p、分布式,区块链笔记 Torrent】webtorrent.min.js的实现之appendTo()函数

官方给出的示例通过appendTo函数渲染文件对象&#xff0c;通过torrent.files的元素对象调用&#xff1a; const WebTorrent require(webtorrent)const client new WebTorrent()// Sintel, a free, Creative Commons movie const torrentId magnet:?xturn:btih:08ada5a7a61…

ALIGN_ Tuning Multi-mode Token-level Prompt Alignment across Modalities

文章汇总 当前的问题 目前的工作集中于单模提示发现&#xff0c;即一种模态只有一个提示&#xff0c;这可能不足以代表一个类[17]。这个问题在多模态提示学习中更为严重&#xff0c;因为视觉和文本概念及其对齐都需要推断。此外&#xff0c;仅用全局特征来表示图像和标记是不…

MySQL数据集成至金蝶云星空的解决方案

MySQL数据集成至金蝶云星空的解决方案 SYB生产用料清单新增-深圳天一-半成品-好&#xff1a;MySQL数据集成到金蝶云星空的技术实现 在企业信息化系统中&#xff0c;数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将聚焦于一个具体案例——如何将MySQL中的生产用料清…