8.9 实现UDP通信

news2024/9/20 14:27:50

目录

write/read到send/recv

函数原型:

常见flags:

sendto与recvfrom

UDP通信的实现过程

服务器端代码、

客户端代码

Makefile


write/read到send/recv

函数原型:

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
前三个参数同read/write一样;
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);

常见flags:

1. 一般设置为0
2. MSG_PEEK:窥视传入的数据。 数据被复制到缓冲区中,但不会从输入队列中删除。
3. MSG_OOB:处理带外(OOB)数据
 

sendto与recvfrom

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

1. 前四个参数同recv/send一样;
2. 后两个参数是通信结构体和结构体的宽度;
 

UDP通信的实现过程

服务器端代码、

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

int main(int argc, char *argv[])
{
​	int fd;
​	struct sockaddr_in addr;
​	char buf[BUFSIZ] = {};
​	if(argc < 3){
​		fprintf(stderr, "%s<addr><port>\n", argv[0]);
​		exit(EXIT_FAILURE);
​	}
​	/*创建套接字*/
​	if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0){
​		perror("socket");
​		exit(EXIT_FAILURE);
​	}
​	/*设置通信结构体*/
​	bzero(&addr, sizeof(addr) );
​	addr.sin_port = htons( atoi(argv[2]) );
​	if(inet_aton(argv[1], &addr.sin_addr) == 0) {
​		fprintf(stderr, "Invalid address\n");
​		exit(EXIT_FAILURE);
​	}
​	/*绑定通信结构体*/
​	if(bind(fd, (struct sockaddr *)&addr, sizeof(addr) ) == -1){
​		perror("bind");
​		exit(EXIT_FAILURE);
​	}
​	while(1){
​		bzero(buf, BUFSIZ);
​		recvfrom(fd, buf, BUFSIZ, 0, NULL, NULL);
​		printf("buf=%s\n", buf);
​	}
​	close(fd);
​	return 0;
}

客户端代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <strings.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[])
{
​	int fd;
​	struct sockaddr_in addr;
​	char buf[BUFSIZ] = {};
​	socklen_t addrlen = sizeof(addr);
​	if(argc < 3){
​		fprintf(stderr, "%s<addr><port>\n", argv[0]);
​		exit(EXIT_FAILURE);
​	}
​	/*创建套接字*/
​	if( (fd = socket(AF_INET, SOCK_DGRAM, 0) ) < 0){
​		perror("socket");
​		exit(EXIT_FAILURE);
​	}
​	/*设置通信结构体*/
​	bzero(&addr, sizeof(addr) );
​	addr.sin_port = htons( atoi(argv[2]) );
​	if(inet_aton(argv[1], &addr.sin_addr) == 0) {
​		fprintf(stderr, "Invalid address\n");
​		exit(EXIT_FAILURE);
​	}
​	while(1){
​		bzero(buf, BUFSIZ);
​		printf("Input->");
​		fgets(buf, BUFSIZ, stdin);
​		sendto(fd, buf, strlen(buf), 0, (struct sockaddr *)&addr, addrlen);
​	}
​	close(fd);
​	return 0;
}

Makefile

CC=gcc
CFLAGS=-Wall
all:server client

clean:
​	rm server client

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

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

相关文章

最优化方法(基于lingo)之 目标规划问题求解(6/6)

一、实验目的&#xff1a; 1. 练习建立实际问题的多目标规划模型。 2. 掌握用数学软件求解多目标规划的方法。 3. 实验从算法思想、实验步骤与程序、运行结果、结果分析与讨论等几方面完成。 4. 预习多目标规划的理论内容。 二、实验内容 题目&#xff1a; 建立模型并求解&…

一篇文章告诉你,全网爆款抓包工具的优劣势

前言 作为软件测试工程师&#xff0c;抓包总是不可避免&#xff1a;遇到问题要做分析需要抓包&#xff1b;发现 bug 需要定位要抓包&#xff1b;检查数据传输的安全性需要抓包&#xff1b;接口测试遇到需求不全的也需要抓包... 就因为抓包在测试工作中无处不在&#xff0c;所以…

TuyaOS 开发固件OTA配置指南

文章目录 一、固件升级配置升级信息设置配置中英文升级文案配置发布范围固件升级验证 二、固件升级发布 通过TuyaOS接入涂鸦云的产品全部默认支持固件OTA功能&#xff0c;TuyaOS设备实现固件OTA需要&#xff1a; 自定义产品创建TuyaOS嵌入式开发固件上传固件OTA配置与发布 等步…

PMP知识点汇总完善版,2023年8月考试就靠它了

第1章 整体管理 1.1 制定项目章程 是制定一份正式批准项目或阶段的文件&#xff0c;并记录能反应干系人需要和期望的初步要求的过程。由项目以外的人员批准&#xff0c;如发起人&#xff0c;批准标志项目的正式启动。 1.1.1 知识点汇总 1、由项目以外的人员批准&#xff0c;如…

Mac iterm Ctrl + V内容前后出现了0~ 1~

背景 笔者周六日加班的时候&#xff0c;被小外甥看到&#xff0c;小外甥就对电脑玩了起来&#xff0c;玩完就这样了 现象 iterm2中复制黏贴出现如下现象&#xff1a; 解决 经过了解是启用了括号粘贴&#xff0c;不得不感叹两岁小外甥这天赋真逆天啊&#xff0c;不辜负他爸…

深入浅出设计模式 - 抽象工厂模式

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

自动化测试框架[Cypress概述]

目录 前言&#xff1a; Cypress简介 Cypress原理 Cypress架构图 Cypress特性 各类自动化测试框架介绍 Selenium/WebDriver Karma Karma的工作流程 Nightwatch Protractor TestCafe Puppeteer 前言&#xff1a; Cypress是一个基于JavaScript的端到端自动化测试框架…

个人自我评价格式范文五篇

★个人自我评价1 工作已经进行两周多了&#xff0c;突然发现自己似乎又重蹈覆辙了&#xff0c;再一次一次的不经意中和某些人的就距离却是越来越来大&#xff0c;总是想偷一下懒&#xff0c;总是想着马马虎虎过去算了&#xff0c;没有那么精打细算过。结果不经意有些人人开始脱…

android的项目下的res文件夹下的部分文件夹介绍

1.看图 drawable文件夹下的图片是不压缩的图片 drawable-xhdpi文件夹下的图片是适合指定分辨率的图片 mipmap-xxhdpi文件夹下的图片是小型设备分辨率的图片

基于物联网、云计算建设的智慧校园云平台源码

电子班牌作为班级文化展示交流的窗口&#xff0c;可以让更多的人看到校园信息建设与班级风格相结合&#xff0c;及时传递校园信息。学生也可以通过电子班牌看到学校近期重要事件的发布&#xff0c;也可以参与回复&#xff0c;让学生及时掌握校园和班级动态。同时&#xff0c;还…

版本管理可视化工具GitKraKe安装

资源下载地址 https://download.csdn.net/download/u012796085/87953404 1 解压后安装GitKrakenSetup-7.5.5.exe 2 命令窗口进入GitKraken存放目录&#xff0c;分别执行以下语句 git clone https://gitee.com/pan13640612207/GitKraken.git cd GitKraken/ yarn install yarn…

STM32使用STM32CUBEMX配置FreeRTOS+SDIO4bit+FATFS注意事项

一、使用STM32CUBEMX配置FreeRTOSSDIO4bitFATFS注意事项&#xff1a; 以STM32F429为例&#xff1a; 1、SDIO配置 配置为4bit模式&#xff0c;此配置不是最终配置&#xff0c;后面会在代码进行修改。 2、Fatfs配置 Set Defines 选项中的配置可以默认&#xff0c;最重要注意Ad…

git配置和git合并

git配置&#xff1a; 首先下载安装git&#xff1a;https://git-scm.com/downloads/ 一路默认&#xff0c;安装完成后&#xff0c;打开文件夹C:\Users\Administrator\.ssh&#xff08;Administrator是当前用户名&#xff09;&#xff0c;在空白处点鼠标右键选择“Git Bush Her…

资源分享开发系统

资源分享系统-开放 提示&#xff1a;开源是学习的来源&#xff0c;分享是进步的体现 近期&#xff0c;使用springboot结合layui写了一个技术管理系统&#xff0c;其实最主要是做一些资源的分享&#xff0c;可便捷生活和学习&#xff0c;包括免费听音乐的网站&#xff0c;免费…

和鲸助力中国大学生计算机设计大赛国赛作品评审标准落实研讨会召开,专家平台首发布

6月16日至19日&#xff0c;中国大学生计算机设计大赛国赛作品评审标准落实研讨会&#xff08;第一期&#xff09;在天津召开&#xff0c;本次会议由中国大学生计算机设计大赛组委会主办&#xff0c;南开大学承办&#xff0c;和鲸社区参与协办。 会议由中国人民大学杜小勇教授、…

GPIO模拟时序控制外设1——WS2812B

文章目录 前言WS2812B1.模块简介2.时序介绍3.硬件介绍4.传输速率&#xff0c;以及帧数要求 代码1.初始化2.模拟时序1.复位函数2.发送0、1码3.封装发送函数 总结 前言 上一篇文章中介绍了整个板子的最基本功能模块——使用GPIO的通用输入输出实现简单的按键输入以及推挽输出控制…

【若依分离版操作方法日志与其它业务数据(如入库操作)关联的实现】

若依框架业务表和操作日志表关联 需求&#xff1a;分析&#xff1a;思路&#xff1a;实现: 需求&#xff1a; 基于若依分离版框架业务数据与操作日志的数据做个关联 入库表 /*入库业务表 */ CREATE TABLE [BS_In]( [Id] int IDENTITY(1,1)…

【MySQL 主从复制与读写分离】

目录 一、MySQL主从复制1.1、主从复制架构和原理1.2、MySQL的扩展1.2.1、什么是读写分离1. 读写分离的基本原理2. MySQL 读写分离原理 1.2.2、为什么要读写分离1.2.3、什么时候要读写分离1.2.4、主从复制与读写分离1.2.5、mysql支持的复制类型 1.3、复制的共用1.4、复制架构1.5…

2023年下半年北京/上海/深圳NPDP产品经理认证招生

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

java学习记录之DBUtils

1 jdbc回顾 1.1 批处理  Statement 执行多条sql addBatch(sql) clearBatch() int[] executeBatch()  PreparedStatement 执行一条sql语句&#xff0c;多组参数 addBatch() 执行之前必须设置实际参数 psmt.setXxxx() clearBatch() executeBatch() 1.2 事务  事务&…