UDP通讯测试

参考资料:UNIX网络编程

实验平台:PC为client,RaspberryPi为server

基本类型和接口函数,参考man手册

    #include <sys/socket.h>struct sockaddr {sa_family_t     sa_family;      /* Address family */char            sa_data[];      /* Socket address */};#include <netinet/in.h>struct sockaddr_in {sa_family_t     sin_family;     /* AF_INET */in_port_t       sin_port;       /* Port number */struct in_addr  sin_addr;       /* IPv4 address */};struct in_addr {in_addr_t s_addr;};typedef uint32_t in_addr_t;typedef uint16_t in_port_t;#include <sys/socket.h>ssize_t sendto(int sockfd, const void buf[.len], size_t len, int flags,const struct sockaddr *dest_addr,socklen_t addrlen);ssize_t recvfrom(int sockfd, void buf[restrict .len], size_t len, int flags,struct sockaddr *src_addr,socklen_t *addrlen);#include <arpa/inet.h>int inet_pton(int af, const char *restrict src, void *restrict dst);const char *inet_ntop(int af, const void *restrict src, char dst[restrict .size], socklen_t size);#include <arpa/inet.h>int inet_pton(int af, const char *restrict src, void *restrict dst);

服务器端


#define SERV_PORT 9877 /* TCP and UDP */void dg_echo(int sockfd, struct sockaddr *p_cli_addr, socklen_t addr_len)
{int  n;socklen_t len;char  mesg[MAXLINE];char addr[addr_len];for ( ; ; ){len = addr_len;n = recvfrom(sockfd, mesg, MAXLINE, 0, p_cli_addr, &len);if(len != 0){inet_ntop(AF_INET, &((struct sockaddr_in *)p_cli_addr)->sin_addr, addr, len);printf("Received %d Bytes : %s From client %s\n", n, mesg, addr);}printf("Now send back!\n");fflush(stdout);sendto(sockfd, mesg, n, 0, p_cli_addr, len);}
}void server_main(void)
{int sockfd;struct sockaddr_in  serv_addr, cli_addr;/* IPPROTO_IP = 0 */      /* Dummy protocol for TCP.  */sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if(sockfd < 0){perror("socket fail");}else{memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family = AF_INET;/* /usr/include/netinet/in.h *//* Address to accept any incoming messages.  *//* #define INADDR_ANY   ((in_addr_t) 0x00000000) */serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);//inet_pton(AF_INET, "192.168.39.39", &servaddr.sin_addr);serv_addr.sin_port = htons(SERV_PORT);bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));dg_echo(sockfd, (struct sockaddr *)&cli_addr, sizeof(cli_addr));}
}

客户端

void dg_cli(FILE *fp, int sockfd, const struct sockaddr *p_serv_addr, socklen_t addr_len)
{int n;socklen_t len;struct sockaddr_in reply_addr;char sendline[MAXLINE];char recv_buf[MAXLINE + 1];char recv_addr[addr_len];while (fgets(sendline, MAXLINE, fp) != NULL){sendto(sockfd, sendline, strlen(sendline), 0, p_serv_addr, addr_len);printf("send successfully!\n");fflush(stdout);n = recvfrom(sockfd, recv_buf, MAXLINE, 0, (struct sockaddr *)&reply_addr, &len);printf("receive success!\n");fflush(stdout);inet_ntop(AF_INET, &reply_addr.sin_addr, recv_addr, len);if((len != addr_len) || (memcmp(p_serv_addr, (struct sockaddr *)&reply_addr, len) != 0)){printf("Replied from %s ignored!\n", recv_addr);continue;}else{printf("Replied from %s with:\n", recv_addr);}recv_buf[n] = '\0';   /* null terminate */fputs(recv_buf, stdout);}
}void client_main(const char *src)
{int  sockfd;struct sockaddr_in serv_addr;memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(SERV_PORT);inet_pton(AF_INET, src, &serv_addr.sin_addr);sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if(sockfd < 0)perror("socket");else{printf("socket len: %ld\n", sizeof(serv_addr));dg_cli(stdin, sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));}}

测试结果

客户端:

服务器:

补充知识:

程序员不应操作sockaddr结构,sockaddr是给操作系统用的
程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。

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

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

相关文章

Docker 笔记(五)--链接

这篇笔记记录了Docker 的Link。 官方文档&#xff1a; Legacy container links - Communication across links 目录 参考Legacy container linksConnect using network port mappingConnect with the linking systemThe importance of naming Communication across linksEnviro…

React Hooks 那些事儿

翻了波之前写的文章还有笔记&#xff0c;发现关于前端的文章并不多&#xff08;好歹也划水做过点前端开发&#xff09;。巧了&#xff0c;最近没什么好话题可写&#xff0c;做下 React Hooks 学习笔记吧。 Effect Hook 不得不说 Hook 的出现降低了我们在 React 中处理副作用&…

LDK加密狗的多种功能特点

LDK加密狗是一种在软件保护领域广泛应用的硬件加密设备&#xff0c;它为软件提供了强有力的版权保护&#xff0c;确保软件开发商的权益得到充分保障。本文将从LDK加密狗的工作原理、功能特点、应用场景以及未来发展等方面进行详细阐述。 LDK加密狗的工作原理基于硬件加密技术。…

深入理解Python中的面向对象编程(OOP)【第129篇—Scikit-learn的入门】

深入理解Python中的面向对象编程&#xff08;OOP&#xff09; 在Python编程领域中&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种强大而灵活的编程范式&#xff0c;它允许开发者以对象为中心组织代码&#xff0c;使得…

为什么选择VR全景进行企业宣传,如何将VR全景运用在企业展示

引言&#xff1a; 随着科技的不断发展&#xff0c;VR全景技术逐渐成为企业宣传的热门选择。那么&#xff0c;为什么越来越多的企业选择使用VR全景技术进行宣传呢&#xff1f; 一&#xff0e;为什么选择VR全景技术进行企业宣传 1. 提升用户体验 VR全景技术可以为用户营造身临…

STM32学习和实践笔记(2): STM32的学习方法

STM32学习方法如下&#xff0c;其余每一个嵌入式芯片的学习流程都是这样的&#xff01; (1&#xff09;基本外设: -GPIO输入输出&#xff0c;外部中断&#xff0c;定时器&#xff0c;串口。-理解并能使用这四个外设&#xff0c;基本就入门了一款MCU。 (2&#xff09;基本外设接…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用教程

原文链接&#xff1a;“SRP模型”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597452&idx5&snf723d9e5858a269d00e15dbe2c7d3dc0&chksmfa823c6…

Linux中udp服务端,客户端的开发

UDP通信相关函数&#xff1a; ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); 函数说明&#xff1a;接收信息 参数说明&#xff1a;sockfd:套接字buf:要接收的缓冲区len:缓冲区…

cuda编程学习——cuda IO 读写文件

例程&#xff1a;MagnumIO/gds/samples/README.md at main NVIDIA/MagnumIO GitHub cufile文档说明&#xff1a;cuFile API Reference Guide - NVIDIA Docs 库安装步骤&#xff1a;NVIDIA GPUDirect Storage Best Practices Guide - NVIDIA Docs

ARM 汇编指令:(四) 位运算指令

一.移位指令 1.LSL 指令 逻辑左移指令&#xff0c;实现将寄存器进行左移操作 lsl r1, r0, #2 //r1 r0 * 2^2 mov r1, r0, lsl, #2 //和上一个汇编指令效果一样 add r1, r0, lsl, #2 //r1 r1 r0 * 2^2 2.LSR 指令 逻辑右移指令&#xff0c;实现将寄存器进行右移操作 ls…

腾讯云轻量应用服务器使用全攻略,都在这!

腾讯云轻量应用服务器怎么使用&#xff1f;轻量应用服务器使用包括快速创建轻量服务器、轻量服务器远程连接、使用轻量应用服务器搭建网站教程、轻量服务器开通端口教程等&#xff0c;腾讯云服务器网txyfwq.com整理了关于腾讯云轻量应用服务器的使用教程&#xff0c;目前轻量应…

(智能考试)自适应度在线考试系统-295-(代码+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword295 智能考试 建3个题库,分别放入3种难度题目若干,判断题(简单题库),2选1(每题1分),选择题(一般题库)4选1(每题2分)和多选(难题库)(每题4分).设定为英语考试就行了. 入题 生成试卷 登陆界面有两种用户可登陆,学生和…

如何打开EDI文件?

使用EDI系统传输文件的过程中&#xff0c;用户可能会遇到这样的问题&#xff1a;如何打开EDI文件&#xff1f;电脑不在身边如何查看EDI文件&#xff1f;EDI文件未按照标准格式呈现如何梳理&#xff1f;为了解决上述问题&#xff0c;方便用户查看文件&#xff0c;知行之桥EDI系统…

Learn OpenGL 09 投光物+多光源

将光投射(Cast)到物体的光源叫做投光物(Light Caster)。 投光物主要分为点光源&#xff0c;聚光灯&#xff0c;平行光。 平行光 当一个光源处于很远的地方时&#xff0c;来自光源的每条光线就会近似于互相平行。不论物体和/或者观察者的位置&#xff0c;看起来好像所有的光都…

无监督学习、自监督学习、有监督学习、SFT监督微调介绍

无监督学习&#xff08;Unsupervised Learning&#xff09; 解释&#xff1a;无监督学习是一种机器学习的方法&#xff0c;其中模型从未标记的数据中学习。也就是说&#xff0c;给模型提供输入数据&#xff0c;但没有给出相应的期望输出或标签。模型需要自己发现数据中的模式、…

软考高级:需求验证概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

linux环境下安装运行环境JDK、Docker、Maven、MySQL、RabbitMQ、Redis、nacos、Elasticsearch

安装JDK 1、提前下载好jdk 官网&#xff1a;点击下载 2、将下载的文件放到自己喜欢的目录下 然后使用下面命令进行解压 tar -zxvf jdk-8u161-linux-x64.tar.gz3、配置环境变量 使用命令 vim /etc/profile在文件的最后插入 export JAVA_HOME/source/java/jdk1.8.0_161 #…

同程旅行前端面试汇总

一、同程旅行一面 自我介绍技术提问 打开新的tab页、window.open是否共享sessionStorage存储的数据vue、react 源码有没有看过&#xff0c;说一下react17 与 react18区别webpack中loader与plugin&#xff0c;有没有自己写过vuex、reactx 刷新数据丢失 怎么做的持久化 反问 总…

内存操作函数

memcpy mem--memory--内存 指向计算机内存 cpy-copy-拷贝 也就是内存拷贝 针对内存的函数 void* memcpy(void * destination,const void * source,size_t num) 把source的空间 复制到 destination的部分 长度是num 如果source 和 dest 的部分有重叠,会复制的结果是未定义的(建…

如何让Windows 10的开始菜单回到7的样子?这里提供详细步骤

前言 在新版本的Windows推出时,你可能会听到一个抱怨,那就是他们对开始菜单做了什么,如果你只想让Windows 10中的开始菜单像Windows 7的开始菜单那样外观和功能,我们将提供帮助。 准备条件 除了Windows 10安装之外,我们唯一需要的是一个非常方便的小程序,那就是Classic…