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

Linux C语言 32-网络编程之UDP例程

Linux C语言 32-网络编程之UDP例程

本节关键字:C语言 网络编程 UDP协议 套接字操作 服务端 客户端
相关C库函数:setsockopt, socket, bind, recvfrom, sendto, close

相关接口介绍

Linux C语言 30-套接字操作

例程执行任务说明

本例程中服务端的任务:

  • 等待客户端发来消息
  • 读取客户端发来的消息并回复

本例程中客户端的任务:

  • 创建1个客户端
  • 间隔1秒,发送消息告知服务端自己的包编号

UDP协议服务端例程实现

// udpserver.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>void msleep(int msecs);
int  getOneServerSocket(const char *ip, int port);int main(int argc, char *argv[])
{int rc, rxn, txn, srvfd, port;int addrLen;struct sockaddr_in remoteAddr;char ip[32] = {0};char rxBuffer[1024] = {0};char txBuffer[1024] = {0};if (argc != 3){printf("please input correct arguments:\n");printf("\tudpserver ip port\n\n");return -1;}// 解析ip和portstrcpy(ip, argv[1]);port = atoi(argv[2]);printf("ip: %s, port: %d\n", ip, port);// 创建套接字srvfd = getOneServerSocket(ip, port);addrLen = sizeof(remoteAddr);while (1){bzero(rxBuffer, sizeof(rxBuffer));rxn = recvfrom(srvfd, rxBuffer, sizeof(rxBuffer)-1, 0, (struct sockaddr*)&remoteAddr, &addrLen);if (rxn > 0){printf("client[%s:%d] socket:%d  %s\n", inet_ntoa(remoteAddr.sin_addr), ntohs(remoteAddr.sin_port), srvfd, rxBuffer);bzero(txBuffer, sizeof(txBuffer));sprintf(txBuffer, "server reply client[%s:%d] -> %s", inet_ntoa(remoteAddr.sin_addr), ntohs(remoteAddr.sin_port), rxBuffer);sendto(srvfd, txBuffer, strlen(txBuffer), 0, (struct sockaddr*)&remoteAddr, addrLen);}}close(srvfd);return 0;
}void msleep(int msecs)
{struct timeval stoptime;stoptime.tv_sec  = (int)(msecs/1000);stoptime.tv_usec = (int)(msecs%1000)*1000;select(0, 0, 0, 0, &stoptime);
}int getOneServerSocket(const char *ip, int port)
{int rc, srvfd, reused, timeout;struct sockaddr_in addr;srvfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (srvfd == -1){perror("create socket");exit(-1);}// 设置端口复用reused = 1;rc = setsockopt(srvfd, SOL_SOCKET, SO_REUSEADDR, &reused, sizeof(reused));if (rc == -1){perror("SO_REUSEDADDR");goto EXIT;}// 设置发送超时限制timeout = 1000; // 1秒setsockopt(srvfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));if (rc == -1){perror("SO_SNDTIMEO");goto EXIT;}// 套接字绑定本地的ip和portaddr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr(ip);bzero(addr.sin_zero, sizeof(addr.sin_zero));rc = bind(srvfd, (struct sockaddr*)&addr, sizeof(addr));if (rc == -1){perror("bind");goto EXIT;}return srvfd;EXIT:close(srvfd);exit(-1);
}

UDP协议客户端例程实现

// udpclient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>void msleep(int msecs);
int  getOneClientSocket(const char *ip, int port, struct sockaddr_in *addr);int main(int argc, char *argv[])
{int rc, rxn, txn, clifd, port;int addrLen;struct sockaddr_in serverAddr;struct sockaddr_in remoteAddr;unsigned int packet_id = 0;char ip[32] = {0};char rxBuffer[1024] = {0};char txBuffer[1024] = {0};if (argc != 3){printf("please input correct arguments:\n");printf("\tudpserver ip port\n\n");return -1;}// 解析ip和portstrcpy(ip, argv[1]);port = atoi(argv[2]);printf("ip: %s, port: %d\n", ip, port);// 创建套接字clifd = getOneClientSocket(ip, port, &serverAddr);addrLen = sizeof(remoteAddr);while (1){bzero(txBuffer, sizeof(txBuffer));sprintf(txBuffer, "Hello, i'm client[%d], packet id: %d", clifd, packet_id++);sendto(clifd, txBuffer, strlen(txBuffer), 0, (struct sockaddr*)&serverAddr, addrLen);bzero(rxBuffer, sizeof(rxBuffer));rxn = recvfrom(clifd, rxBuffer, sizeof(rxBuffer)-1, 0, (struct sockaddr*)&remoteAddr, &addrLen);if (rxn > 0){printf("server[%s:%d] -> %s\n", inet_ntoa(remoteAddr.sin_addr), ntohs(remoteAddr.sin_port), rxBuffer);}msleep(1000);}return 0;
}void msleep(int msecs)
{struct timeval stoptime;stoptime.tv_sec  = (int)(msecs/1000);stoptime.tv_usec = (int)(msecs%1000)*1000;select(0, 0, 0, 0, &stoptime);
}int getOneClientSocket(const char *ip, int port, struct sockaddr_in *addr)
{int rc, srvfd, reused, timeout;srvfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (srvfd == -1){perror("create socket");exit(-1);}// 设置端口复用reused = 1;rc = setsockopt(srvfd, SOL_SOCKET, SO_REUSEADDR, &reused, sizeof(reused));if (rc == -1){perror("SO_REUSEDADDR");goto EXIT;}// 设置发送超时限制timeout = 1000; // 1秒setsockopt(srvfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));if (rc == -1){perror("SO_SNDTIMEO");goto EXIT;}// 套接字绑定本地的ip和portaddr->sin_family = AF_INET;addr->sin_port = htons(port);addr->sin_addr.s_addr = inet_addr(ip);bzero(addr->sin_zero, sizeof(addr->sin_zero));return srvfd;EXIT:close(srvfd);exit(-1);
}

例程编译及运行

UDP服务端例程编译及运行结果
$ gcc udpserver.c -o udpserver
$ ./udpserver 0.0.0.0 88888
ip: 0.0.0.0, port: 88888
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 0
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 1
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 2
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 3
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 4
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 5
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 6
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 7
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 8
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 9
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 10
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 11
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 12
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 13
client[192.168.146.128:52147] socket:3  Hello, i'm client[3], packet id: 14
UDP客户端例程编译及运行结果
# 服务端IP为192.168.146.128
$ gcc udpclient.c -o udpclient
$ ./udpclient 192.168.146.128 88888
ip: 192.168.146.128, port: 88888
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 0
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 1
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 2
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 3
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 4
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 5
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 6
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 7
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 8
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 9
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 10
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 11
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 12
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 13
server[192.168.146.128:23352] -> server reply client[192.168.146.128:52147] -> Hello, i'm client[3], packet id: 14

相关文章:

Linux C语言 32-网络编程之UDP例程

Linux C语言 32-网络编程之UDP例程 本节关键字&#xff1a;C语言 网络编程 UDP协议 套接字操作 服务端 客户端 相关C库函数&#xff1a;setsockopt, socket, bind, recvfrom, sendto, close 相关接口介绍 Linux C语言 30-套接字操作 例程执行任务说明 本例程中服务端的任务…...

ubuntu22.04系统下载程序和依赖,并拷贝到指定路径下

脚本1 apt install aptitude apt-get -d install xxx #xxx是待下载的安装包 mv /var/cache/apt/archives/* /home/tuners/1apt install aptitude apt-get -d install xxx mv /var/cache/apt/archives/*.deb /home/tuners/1 xxx 为程序包名称 /home/tuners/1为保存程序包的…...

Kafka KRaft 版本集群部署详细教程(附配置文件详细解释)

版本说明 Ubuntu 18.04.6Kafka 3.6.0JDK8 集群配置 操作系统ip域名Kafka Broker 端口Kafka Controller 端口Ubuntu 18.04.6192.168.50.131kafka1.com90929093Ubuntu 18.04.6192.168.50.132kafka2.com90929093Ubuntu 18.04.6192.168.50.133kafka3.com90929093 安装 vim, cur…...

在龙蜥 anolis os 23 上 源码安装 PostgreSQL 16.1

在龙蜥 OS 23上&#xff0c;本来想使用二进制安装&#xff0c;结果发现没有针对龙蜥的列表&#xff1a; 于是想到了源码安装&#xff0c;下面我们列出了PG源码安装的步骤&#xff1a; 1.安装准备 1.1.创建操作系统组及用户 groupadd postgres useradd -g postgres -m postgr…...

UDP的不可靠性可以用来做什么

User Datagram Protocol&#xff08;UDP&#xff0c;用户数据报协议&#xff09;是互联网协议套件中的一种传输层协议。与TCP不同&#xff0c;UDP是一种无连接的、不可靠的协议。 要知道UDP可以用来做什么&#xff0c;首先我们要知道它有何特点: 1,无连接&#xff1a; UDP是一…...

vue3还用this吗?getCurrentInstance获取当前组件实例

在 Vue 2 中&#xff0c;this 关键字代表当前组件实例。在组件的选项对象中&#xff0c;this 可以用于访问组件实例的属性、方法以及 Vue 实例的一些特定方法。 在Vue3中&#xff0c;我们发现this是undefined&#xff0c;那我们真的没法使用this了吗&#xff1f;vu3给我们提供…...

高校学生宿舍公寓报修维修生活管理系统 微信小程序b2529

本课题要求实现一套基于微信小程序宿舍生活管理系统&#xff0c;系统主要包括&#xff08;管理员&#xff0c;学生、维修员和卫检员&#xff09;四个模块等功能。 使用基于微信小程序宿舍生活管理系统相对传统宿舍生活管理系统信息管理方式具备很多优点&#xff1a;首先可以大幅…...

C++类与对象(7)—友元、内部类、匿名对象、拷贝对象时编译器优化

目录 一、友元 1、定义 2、友元函数 3、友元类 二、内部类 1、定义 2、特性&#xff1a; 三、匿名对象 四、拷贝对象时的一些编译器优化 1、传值&传引用返回优化对比 2、匿名对象作为函数返回对象 3、接收返回值方式对比 总结&#xff1a; 一、友元 1、定义…...

Django回顾2

目录 一.HTTP 1.URL介绍 2.格式&#xff1a; 3.补充&#xff1a; 二.web框架 1.什么是框架 2.什么是web框架 3.wsgi协议 基于wsgi协议的web服务器&#xff1a; 4.协议是怎么规定的 三.Django 1.MVC与MTV模型&#xff08;所有框架其实都遵循MVC架构&#xff09; 2.…...

<JavaDS> 二叉树遍历各种遍历方式的代码实现 -- 前序、中序、后序、层序遍历

目录 有以下二叉树&#xff1a; 一、递归 1.1 前序遍历-递归 1.2 中序遍历-递归 1.3 后序遍历-递归 二、递归--使用链表 2.1 前序遍历-递归-返回链表 2.2 中序遍历-递归-返回链表 2.3 后序遍历-递归-返回链表 三、迭代--使用栈 3.1 前序遍历-迭代-使用栈 3.2 中序遍…...

如何控制Spring工厂创建对象的次数?详解Spring对象的声明周期!

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…...

计算机杂谈系列精讲100篇-【计算机应用】PyTorch部署及分布式训练

目录 C平台PyTorch模型部署流程 1.模型转换 1. 不支持的操作 2. 指定数据类型 2.保存序列化模型 3.C load训练好的模型 4. 执行Script Module PyTorch分布式训练 分布式并行训练概述 Pytorch分布式数据并行 手把手渐进式实战 A. 单机单卡 B. 单机多卡DP C. 多机多卡DDP D. L…...

Opencv-C++笔记 (19) : 分水岭图像分割

文章目录 一、基于距离变换与分水岭的图像分割1、图像分割2、距离和变换与分水岭距离变换常见算法有两种分水岭变换常见的算法 3、距离变换API函数接口4、watershed 分水岭函数API接口步骤 5、代码 一、基于距离变换与分水岭的图像分割 1、图像分割 图像分割(Image Segmentat…...

Linux以nohup方式运行jar包

1、在需要运行的jar包同级目录下建立启动脚本文件&#xff1a; 文件内容&#xff1a; #! /bin/bash #注意&#xff1a;必须有&让其后台执行&#xff0c;否则没有pid生成 jar包路径为绝对路径 nohup java -jar /usr/local/testDemo/jdkDemo-0.0.1-SNAPSHOT.jar >/us…...

【c++|SDL】开始使用之---demo

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 SDL 记录 1. hello word #include<SDL2/SDL.h>SDL_Window* g_pWindow 0; SDL_Renderer* g_pRenderer 0;int main(int argc, char* args[]) {//…...

leetcode:有效的括号

题目描述 题目链接&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 题目分析 题目给了我们三种括号&#xff1a;&#xff08;&#xff09;、{ }、[ ] 这里的匹配包括&#xff1a;顺序匹配和数量匹配 最优的思路就是用栈来解决&#xff1a; 括号依次入栈…...

使用STM32微控制器实现光电传感器的接口和数据处理

光电传感器在许多领域中被广泛应用&#xff0c;例如工业自动化、智能家居等。本文将介绍如何使用STM32微控制器实现光电传感器的接口和数据处理的方案&#xff0c;包括硬件设计、引脚配置、数据采集、滤波和阈值判断等关键步骤&#xff0c;并给出相应的代码示例。 一、引言 光…...

ELK企业级日志分析平台——kibana数据可视化

部署 新建虚拟机server5&#xff0c;部署kibana [rootelk5 ~]# rpm -ivh kibana-7.6.1-x86_64.rpm [rootelk5 ~]# cd /etc/kibana/[rootelk5 kibana]# vim kibana.ymlserver.host: "0.0.0.0"elasticsearch.hosts: ["http://192.168.56.11:9200"]i18n.local…...

Shell条件变量练习

1.算数运算命令有哪几种&#xff1f; (1) "(( ))"用于整数运算的常用运算符&#xff0c;效率很高 [rootshell scripts]# echo $((24*5**2/8)) #(( ))2452814 14 (2) "$[ ] "用于整数运算 [rootshell scripts]# echo $[24*5**2/8] #[ ]也可以运…...

【PHP】MySQL简介与MySQLi函数(含PHP与MySQL交互)

文章目录 一、MySQL简介二、MySQLi函数1. 开启mysqli扩展&#xff1a;2. PHP MySQLi扩展的常用函数 三、PHP与MySQL交互0. 准备1. 创建连接&#xff08;mysqli_connect() &#xff09;连接mysql语法 2. 选择数据库&#xff08;mysqli_select_db()&#xff09;3. 在php中操作数据…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...