UDP客户端和服务器

news2024/11/26 12:37:06

UDP客户端,也就是首先主动发送数据的一方,也就是发起服务请求的一方。

UDP服务器,也就是首先等待接收数据,并对接收的数据进行处理,返回计算结果的一方,也就是提供服务的一方。

涉及的函数

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);
int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
int send(int s, const void *msg, size_t len, int flags);

 udp客户端测试

测试代码 

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <fcntl.h>
#include <time.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

int main(int argc, char *argv[])
{
    int client_socket;
    client_socket = socket(AF_INET,SOCK_DGRAM,0);
    DEBUG_INFO("client_socket = %d",client_socket);

    struct sockaddr_in server_addr;
    server_addr.sin_port = htons(6600);
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("192.168.0.5");
    char buf[100];
    snprintf(buf,sizeof(buf),"time=%d",time(NULL));

    DEBUG_INFO("server_addr %s:%d on socket %d\n",
                           inet_ntoa(server_addr.sin_addr),
                           htons(server_addr.sin_port),
                           client_socket);
    socklen_t addrlen = sizeof(server_addr);
    int send_len = sendto(client_socket,buf,strlen(buf),0,&server_addr,sizeof(server_addr));
    memset(buf,0,sizeof(buf));
    DEBUG_INFO("sendto %s:%d \n",
                           inet_ntoa(server_addr.sin_addr),
                           htons(server_addr.sin_port));
    int read_len = recvfrom(client_socket,buf,sizeof(buf),0,&server_addr,&addrlen);
    DEBUG_INFO("recvfrom %s:%d  -- %s\n",
                           inet_ntoa(server_addr.sin_addr),
                           htons(server_addr.sin_port),
                           buf);
    
    sleep(5);
    return 0;
}

UDP接收端(服务器)

执行代码:

  

实验解析 

 UDP客户端向192.168.0.5:6600 地址发送时间值,UDP接受端,也就是调试助手,返回一个字符串。然后UDP客户端等待5秒退出。这可以用来实现一个NTP服务器

UDP服务端 

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <fcntl.h>

// #define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <fcntl.h>
#include <time.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

int main(int argc, char *argv[])
{
    int server_socket;
    int res = 0;
    int on = 1;
    server_socket = socket(AF_INET,SOCK_DGRAM,0);
    DEBUG_INFO("server_socket = %d",server_socket);

    if(setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR,&on,sizeof(on)) < 0){
        perror("setsockopt");
        exit(-1);
    }

    struct sockaddr_in server_addr;
    server_addr.sin_port = htons(6600);
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("192.168.0.11");

    res = bind(server_socket,(const struct sockaddr *)&server_addr,sizeof(server_addr));
    if(res == -1){
        perror("bind");
        return -1;
    }
    int len = 0;
    char buf[100];
    socklen_t addrlen;
    struct sockaddr_in client_server;
    while(1){
        memset(buf,0,sizeof(buf));
        memcpy(&client_server,&server_addr,sizeof(client_server));
        addrlen = sizeof(client_server);
        recvfrom(server_socket,buf,sizeof(buf),0,&client_server,&addrlen);
        DEBUG_INFO("buf = %s",buf);
        DEBUG_INFO("recfrom %s:%d  -- %s\n",
                           inet_ntoa(client_server.sin_addr),
                           htons(client_server.sin_port),
                           buf);
        addrlen = sizeof(client_server);
        sendto(server_socket,buf,strlen(buf),0,&client_server,addrlen);
    }
    
    sleep(5);
    return 0;
}

修改客户端中的IP地址为192.168.0.11,也就是虚拟机的IP地址

 实验解析:

服务器等待接收数据。客户端向服务端发送数据,服务器端接收数据后,将数据原样返回。然后服务端继续等待接收数据。客户端发送完毕后等待接收,接收到数据后睡眠5秒退出程序。

使用connect的客户端 

虽然UDP是无连接的,但是connect函数依然有效,它高速操作系统,默认从哪里接收数据,默认向谁发送数据。这样就可以使用read,wirte、send、recv这四个没有指定地址的函数来收发数据了。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <fcntl.h>
#include <time.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%s:%d -- "format"\n" \
,__FILE__,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif

int main(int argc, char *argv[])
{
    int client_socket;
    int res = 0;
    client_socket = socket(AF_INET,SOCK_DGRAM,0);
    DEBUG_INFO("client_socket = %d",client_socket);

    struct sockaddr_in remote_addr;
    remote_addr.sin_port = htons(6600);
    remote_addr.sin_family = AF_INET;
    remote_addr.sin_addr.s_addr = inet_addr("192.168.0.11");
    char buf[100];
    snprintf(buf,sizeof(buf),"time=%d",time(NULL));

    DEBUG_INFO("remote_addr %s:%d on socket %d\n",
                           inet_ntoa(remote_addr.sin_addr),
                           htons(remote_addr.sin_port),
                           client_socket);
    
    res = connect(client_socket,&remote_addr,sizeof(remote_addr));
    int send_len = send(client_socket,buf,strlen(buf),0);
    memset(buf,0,sizeof(buf));
    int read_len = recv(client_socket,buf,sizeof(buf),0);

    DEBUG_INFO("recv %s:%d  -- %s\n",
                           inet_ntoa(remote_addr.sin_addr),
                           htons(remote_addr.sin_port),
                           buf);
    
    sleep(5);
    return 0;
}

 测试结果:

 

小结

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

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

相关文章

实现Linux 视频聊天、远程桌面(源码,支持信创环境,可与Windows版、安卓版互通)

有朋友在下载并了解了《C# 实现 Linux 视频会议&#xff08;源码&#xff0c;支持信创环境&#xff0c;银河麒麟&#xff0c;统信UOS&#xff09;》中提供的源码后&#xff0c;留言给我说&#xff0c;这个视频会议有点复杂了&#xff0c;代码比较多&#xff0c;看得有些费劲。问…

嵌入式系统标志的策略和技巧

当在嵌入式系统中使用标志时&#xff0c;可以考虑以下优化措施&#xff1a; 图像压缩&#xff1a;由于嵌入式系统通常具有有限的存储空间&#xff0c;可以使用图像压缩算法来减小标志的文件大小。常见的压缩算法包括JPEG、PNG等&#xff0c;可以根据系统的要求选择合适的压缩算…

Gradle多模块项目搭建完整教程,模块互相依赖,基于springboot开发

1.父项目创建&#xff0c;【com.fdw.hibernate】 2.子项目创建&#xff0c;【com.fdw.study】【com.fdw.parent】 3.最终结构目录 4. 父工程build.gradle plugins {id java }allprojects {// 指定需要的插件// 指定语言apply plugin: java//指定编辑器apply plugin: idea// 配…

漏洞复现Tomcat系列弱口令、CVE-2017-12615、CVE-2020-1938

文章目录 提提神tomcat8 弱口令介绍&#xff1a;复现&#xff1a; Tomcat PUT方法任意写文件漏洞&#xff08;CVE-2017-12615&#xff09;介绍&#xff1a;复现&#xff1a; Tomcat AJP 文件包含漏洞&#xff08;CVE-2020-1938&#xff09;介绍&#xff1a;复现&#xff1a; 提…

c#/c++ 通过系统api监视文件变化的问题

再分享个比较经典的案例&#xff0c;在很多场景下&#xff0c;我们都要去监视某个文件夹下的文件变化&#xff0c;在创建、修改或删除的时候触发一些行为。众所周知&#xff0c;c#有个实现类叫FileSystemWatcher&#xff0c;可以用来监视目录包括子目录下文件的变化&#xff0c…

亚马逊云科技,定义了生成式AI的生产力

众所周知&#xff0c;要把大模型转化为生产力&#xff0c;AI模型、算力和数据会是难以逾越的门槛。新的目标已经出现&#xff0c;我们是否有了足够强大的AI基础设施&#xff1f;在6月28日上海举行的峰会上&#xff0c;亚马逊云科技展示了这样的能力。 从掀起AI画图热潮的Stabil…

【深度学习笔记】深层神经网络

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

select 框添加树结构(todu)

1. 案例: 2. 代码 下班了&#xff0c;明天写

蓝桥杯专题-真题版含答案-【马虎的算式】【振兴中华】【黄金连分数】【打印十字图】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

day27-MySQL拓展

0目录 第六章 MySQL拓展 1.MySQL拓展 1.1 事务定义&#xff1a;事务就是将一组SQL语句放在同一批次内去执行&#xff0c;如果一个SQL语句出错&#xff0c;则该批次内的所有sql都将被取消执行。 1.2 事务ACID原则 (1)原子性 一个事务要么全部提交成功&#xff0c;要么全部…

「深度学习之优化算法」(九)群搜索算法

1. 群搜索算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   群搜索算法(Group Search Optimizer)是一种基于发现者,跟随者,游荡者模型而产生的算法。算法模型较为复杂,提出时间也不长,对于其的深度研究相对较少,但也有一定的应用研究。   在群搜索算法…

【雕爷学编程】Arduino动手做(150)---旋转角度传感器模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【IDE 小程序】小程序控制台 不打印 console.log问题

小程序控制台 不打印 console.log问题 全局搜索compress.drop_console&#xff08;一般在config文件中&#xff09;&#xff0c;设置为false&#xff0c;再重新打开小程序即可

4、架构:Canvas VS DOM

在可视化搭建的低代码平台中&#xff0c;设计器是一个非常关键的模块&#xff0c;可以帮助用户通过拖拽、配置等方式快速搭建应用界面。 在技术选型方面&#xff0c;目前市面上主流的设计器技术包括基于 HTML/CSS/JavaScript 的 Web 设计器。 在渲染方案方面&#xff0c;主流…

TiDB(6):数据迁移-TiDB Lightning

1 TiDB Lightning介绍 TiDB Lightning 是一个将全量数据高速导入到 TiDB 集群的工具&#xff0c;目前支持 Mydumper 或 CSV 输出格式的数据源。你可以在以下两种场景下使用 Lightning&#xff1a; 迅速导入大量新数据。 备份恢复所有数据。 TiDB Lightning 主要包含两个部分…

NSS [SWPUCTF 2021 新生赛]jicao

NSS [SWPUCTF 2021 新生赛]jicao 先看题目&#xff0c;要求我们post传参一个id。然后get一个变量叫json&#xff0c;并且通过json_decode()对一串JSON进行解码 payload&#xff1a; GET&#xff1a; ?json{"x":"wllm"} POST&#xff1a;idwllmNB

java中处理异常规范

java处理异常规范 文章目录 java处理异常规范一、尽量不要使用e.printStackTrace(),而是使用log打印,并记录exception二、不要用一个Exception捕捉所有可能的异常三、使用finally关闭流资源或者直接使用try-with-resource四、捕获异常与抛出异常必须是完全匹配&#xff0c;或者…

Spring Boot 中的 Redis 分布式锁

Spring Boot 中的 Redis 分布式锁 在分布式系统中&#xff0c;多个进程同时访问共享资源时&#xff0c;很容易出现并发问题。为了避免这些问题&#xff0c;我们可以使用分布式锁来保证共享资源的独占性。Redis 是一款非常流行的分布式缓存&#xff0c;它也提供了分布式锁的功能…

react - TS

TypeScript TypeScript 简称『TS』&#xff0c;是微软开发的一个开源的编程语言。 一、TS 特点 TS 主要有如下几个特点: 完全兼容 JavaScript&#xff0c;是 JavaScript 的超集 引入类型系统&#xff0c;可以尽早的定位错误位置, 帮助提升开发效率 let obj {a:1,b:2....}o…

四氯化硅铝的活性离子蚀刻

引言 铝膜广泛用于集成电路中的互连线。随着电路的集成规模和密度变得越来越大&#xff0c;有必要将互连线和间隔的宽度减小到几乎薄膜厚度。为了实现这一点&#xff0c;已经开发了具有定向蚀刻能力的平行平面电极型等离子体蚀刻。这被称为反应离子蚀刻&#xff0c;因为它采用…