Linux下C语言UDP协议通信实践

news2024/11/27 14:49:34

UDP和TCP协议一样,都是传输层协议。是无连接的,不安全的,报式传输层协议,通信过程默认也是阻塞的。其通信特点主要如下:

(1)不需要建立连接 ,所以不需要进行 connect () 操作

(2)每次通信都需要指定数据接收端的IP和端口,不会记忆上一次的通讯地址

(3)不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息

(4)对接收到的数据报不回复确认信息,发送端不知道数据是否被正确接收,也不会重发数据。

(5)如果发生了数据丢失,全部数据都会丢失

1.通信流程图

 

2.关键函数说明

2.1 socket

int socket(int domain, int type, int protocol);

作用:创建socket套接字

参数:
domain:协议,AF_INET : IPv4,AF_INET6: IPv6
type:传输协议类型,报式传输协议为 :SOCK_DGRAM
protocol:指定为 0,表示传输协议 UDP
返回值:调用成功返回一个可用的文件描述符(大于 0),失败返回 - 1

2.2 sendto

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
               const struct sockaddr *dest_addr, socklen_t addrlen);

作用:发送数据
参数:
sockfd: udp 的通信的文件描述符
buf: 要发送的数据
len: 发送数据的长度
flags: 套接字属性,一般使用默认属性,指定为 0 即可
dest_addr: 对端对应的地址信息,包含大端的 IP 和端口
addrlen: dest_addr 的内存大小
返回值:调用成功返回实际发送的字节数,调用失败返回 - 1

2.3 recvfrom

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

作用:接收数据,如果没有数据,该函数会阻塞

参数:
sockfd: udp 的通信的文件描述符
buf: 储接收的数据地址
len: buf 容量,字节为单位
flags: 套接字属性,使用默认属性,指定为 0 即可
src_addr: 对端端的地址信息,IP 和端口信息,跨网络所以是大端存储
如果不需要对端信息,设置为 NULL
addrlen: src_addr占用字节大小,如果src_addr为NULL,该参数也设置为NULL
返回值:成功返回接收的字节数,失败返回 - 1

3.代码实现

3.1服务器

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
    if (argc < 0) {
        printf("a.out {port}");
        return -1;
    }

    int fd = socket(AF_INET, SOCK_DGRAM, 0);
    if(fd == -1)
    {
        perror("socket");
        exit(0);
    }

    struct sockaddr_in addr;
    unsigned short port = port;
    sscanf(argv[1], "%hu", &port);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = INADDR_ANY;
    int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
    if(ret == -1)
    {
        perror("bind");
        exit(0);
    }
    printf("bind port %d, wait client connect ...\n", port);
    char buf[1024];
    char ipbuf[64];
    struct sockaddr_in cliaddr;
    int len = sizeof(cliaddr);

    while(1)
    {
        memset(buf, 0, sizeof(buf));
        int rlen = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)&cliaddr, &len);
        printf("client info, ip: %s, port: %d\n",
               inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, ipbuf, sizeof(ipbuf)),
               ntohs(cliaddr.sin_port));
        printf("recvfrom client say: %s\n", buf);
        sendto(fd, buf, rlen, 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));
    }

    close(fd);

    return 0;
}

3.2客户端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
    if (argc < 0) {
        printf("a.out {port}");
        return -1;
    }

    int fd = socket(AF_INET, SOCK_DGRAM, 0);
    if(fd == -1)
    {
        perror("socket");
        exit(0);
    }
    

    struct sockaddr_in seraddr;
    seraddr.sin_family = AF_INET;
    unsigned short port = port;
    sscanf(argv[1], "%hu", &port);
    seraddr.sin_port = htons(port);
    inet_pton(AF_INET, "127.0.0.1", &seraddr.sin_addr.s_addr);

    char buf[1024];
    char ipbuf[64];
    struct sockaddr_in cliaddr;
    int len = sizeof(cliaddr);
    int num = 0;

    while(1)
    {
        sprintf(buf, "hello, I am udp client %d....\n", num++);
        sendto(fd, buf, strlen(buf)+1, 0, (struct sockaddr*)&seraddr, sizeof(seraddr));
        memset(buf, 0, sizeof(buf));
        recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);
        printf("recvfrom server say: %s\n", buf);
        sleep(1);
    }
    close(fd);
    return 0;
}

4.运行效果

 

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

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

相关文章

国产操作系统之凝思磐石安装

一、凝思磐石操作系统简介 安全性是凝思磐石安全服务平台软件V2.4的主要特征&#xff0c;充分结合凝思科技独有技术与国内外多项安全标准的要求&#xff0c;在操作系统和应用程序的各个层次进行安全增强&#xff0c;使系统成为安全的有机整体。主要安全机制有以下几点&#xff…

高校房产管理现状及数图互通解决方案?

高校拥有大量的房产土地资源、公共设施、公有住房等&#xff0c;是高校开展各类教学、科研的基础场所&#xff0c;也是学校国有资产不可缺少的一部分。但是在管理过程中&#xff0c;存在着较多的困难与问题&#xff1a; 1.房地产的有效利用率不高 2.房地产管理信息化速度较慢…

异常解决!针对文件I/O写入操作时FileNotFoundException异常的修复

一. 异常问题 I/O对于在Java学习路上的初学者来说&#xff0c;简直就是一道长长的坎儿。我们在使用I/O的过程中&#xff0c;会有许多的异常需要处理&#xff0c;并且其中还带有一系列的验证逻辑在其中。如果在学习过程中&#xff0c;我们的基础打得不牢靠&#xff0c;那么可能…

如何在Xshell上运行一个C文件?

1.设置XTP服务器配置 按下图点击&#xff0c;创建一个新的连接&#xff1a; 如图所示&#xff0c;创建成功 2.Xshell界面创建 如图界面&#xff0c;就说明成功了 3.在电脑任意位置保存一个txt文件&#xff0c;注意扩展名要改成.c 4.在Xftp中导入刚写好的.c文件 如图&#xff…

pom报红

若是从其他地方导入的新工程&#xff0c;右边 maven 管理工具中 dependencies 若出现红色波浪线。通常用以下方式尝试解决。 第一步 0.导入外部项目&#xff0c;先配置jdk。 1.&#xff08;检查maven仓库配置是否正确&#xff09;File --> settings 输入maven&#xff0…

爆料,前华为微服务专家纯手打500页落地架构实战笔记,已开源

开篇 微服务是现代系统中非常受关注的“焦点”&#xff0c;越来越多地分布式系统都纷纷采用微服务的设计理念来演进其架构模型。随着微服务应用规模的增长&#xff0c;治理膨胀的系统会越来越困难。比起微服务设计和拆分&#xff0c;如何能够更好地治理大规模的微服务&#xf…

LeetCode每日一题——813. 最大平均值和的分组

LeetCode每日一题系列 题目&#xff1a;813. 最大平均值和的分组 难度&#xff1a;普通 文章目录LeetCode每日一题系列题目示例思路题解题目 给定数组 nums 和一个整数 k 。我们将给定的数组 nums 分成 最多 k 个相邻的非空子数组 。 分数 由每个子数组内的平均值的总和构成…

制作一个简单HTML西安旅游网页(HTML+CSS)

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

Java以form-data(表单)的形式调用第三方接口

Java以form-data&#xff08;表单&#xff09;的形式调用第三方接口前言本文目标用到的类工具类及测试信息工具类代码测试信息测试代码测试结果遇到的问题getContentLength()的滥用调用的错误慎用请求输出流flush()方法未写入标识调用错误总结前言 之前写的调用第三方接口&…

【机器学习】推荐系统

推荐系统的工作原理 推荐模型如何进行推荐将取决于您拥有的数据类型。如果您只拥有过去发生的交互数据&#xff0c;您可能有兴趣使用协作过滤。如果您有描述用户及其与之交互过的物品的数据&#xff08;例如&#xff0c;用户的年龄、餐厅的菜系、电影的平均评价&#xff09;&a…

Windows线程 信号量 CreateSemaphore创建信号量、RelaseSemaphore设置信号量

信号量 相关问题 类似于事件&#xff08;作用类似&#xff09;&#xff0c;解决通知的相关问题。但提供一个计数器&#xff0c;可以设置次数。 信号量的使用 1.创建信号量 HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//参数作废&#xff0c;基本用N…

临近期末,这些题不来看看吗?(下)

目录 1、打印1~100之间所有3的倍数&#xff08;三种方法&#xff09; 2、写出3给整数从大到小输出 3、给定两个数&#xff0c;求这两个数的最大公约数 4、 递归实现n的k次方 5、写一个递归函数DigitSum(n),输入一个非负整数&#xff0c;返回组成它的数字之和 6、编写一个…

二叉树模板套题——相同的树的应用

文章目录力扣100. 相同的树递归展开图力扣572. 另一棵树的子树递归展开图力扣101. 对称二叉树递归展开图力扣100. 相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xf…

四、nginx正向代理

一、正向代理 解释&#xff1a;正向代理指的是客户端通过访问目标服务端&#xff0c;再由目标服务端来转发流量访问互联网 结构图如下&#xff1a; 好处&#xff1a;这样做的好处是&#xff0c;当客户端通过服务端访问互联网某个网站时&#xff0c;该网站获得的IP地址是服务…

STEAM上的一款电路模拟神器 — CRUMB Circuit Simulator

摘要&#xff1a;这几天在逛steam商店时&#xff0c;发现了一款有意思的电路仿真软件CRUMB Circuit Simulator&#xff08;CRUMB电路模拟器&#xff09;&#xff0c;觉得挺有意思的&#xff0c;就下载了玩了一下。 这款模拟电路软件的东西不多&#xff0c;基础的元器件都有&…

关于赚钱这件事,必须做到「金钱场」、「认知场」和「人脉场」三场统一

每周末&#xff0c;我会将我付费星球内的精华文章&#xff0c;在每周六或周日以付费文章的方式在公众号分享给大家&#xff0c;如果你不想加入我的星球&#xff0c;还想看的话&#xff0c;可以在这里付费看。当然&#xff0c;加入星球会更划算&#xff0c;因为星球内内容更多&a…

ArcGIS基础:如何在大量数据里挑选随机样本(创建随机点工具)

【创建随机点】工具位于【采样】工具下&#xff0c;如下所示&#xff1a; 假如我们有一个需求&#xff0c;要在很多数据里随机选择10个数据&#xff0c;就可以使用该工具。 假如我这里有全国的县级数据&#xff0c;我想要在里面随机抽选10个县城。 原始数据如下&#xff1a; …

IPSec 基础介绍

IPSec是IETF&#xff08;Internet Engineering Task Force&#xff09;制定的一组开放的网络安全协议。它并不是一个单独的协议&#xff0c;而是一系列为IP网络提供安全性的协议和服务的集合&#xff0c;包括认证头AH&#xff08;Authentication Header&#xff09;和封装安全载…

【JavaScript高级】05-JavaScript中with、eval语句及严格模式的使用

with、eval及严格模式的使用with语句的使用&#xff08;了解&#xff09;eval函数严格模式了解严格模式开启严格模式严格模式的限制with语句的使用&#xff08;了解&#xff09; with语句的作用是将代码的作用域设置到一个特定的对象中。目的主要是为了简化多次编写同一个对象…

【学习笔记50】ES6的新增属性1

一、ES6 * ES6 * 其实就是JS发展过程中的某一个版本而已, 那个版本的版本号叫做ES6* JS* 在最初的时候, 是只有var关键可以声明变量* 随着版本的更新, 在某一个版本内推出了新的变量声明方式* * JS的更新* 在推出ES6的时候, 这个版本推出的新东西比较多…