Linux中UDP服务端和客户端

1 服务端代码

#include <stdio.h>
#include <head.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>#define PORT 6666 //端口号:1024~49191
#define IP "192.168.1.110"//"192.168.122.120"int main(int argc, const char *argv[])
{//创建报式套接字int sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd < 0){ERR_MSG("socket");return -1;}printf("sfd = %d\n",sfd);//填充服务器自身的地址信息结构体,真实的地址信息结构体根据地址族制定//AF_INET : man 7 ipstruct sockaddr_in sin;sin.sin_family         = AF_INET;      //必须填AF_INETsin.sin_port           = htons(PORT);  //端口号:1024~49151sin.sin_addr.s_addr    = inet_addr(IP);//本机IP:ifconfig//绑定服务器的地址信息结构体到套接字上if(bind(sfd, (struct sockaddr*)&sin,sizeof(sin)) < 0){ERR_MSG("bind");return -1;}printf("bind success\n");char buf[128]="";ssize_t res=0;struct sockaddr_in cin;socklen_t addrlen= sizeof(cin);while(1){bzero(buf,sizeof(buf));//接收数据//res = recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL);//res = recv(sfd,buf,sizeof(buf),0);//res = read(sfd,buf,sizeof(buf));res = recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);if(res < 0){ERR_MSG("recvfrom");return -1;}printf("[%s : %d] : %s\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);//buf[sizeof(buf)-1]=0;strcat(buf,"*_*");//发送数据if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0){ERR_MSG("sendto");return -1;}printf("sendto success\n");}//关闭文件描述符close(sfd);return 0;
}

2 客户端代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <head.h>#define PORT 6666               //端口号:服务器绑定的端口号
#define IP "192.168.1.110"//"192.168.122.109"    //IP:服务器绑定的IPint main(int argc, const char *argv[])
{//创建报式套接字int cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd < 0){ERR_MSG("socket");return -1;}printf("cfd = %d\n", cfd);//绑定客户端的地址信息结构体到套接字上---->非必须绑定//若不绑定,则操作系统会给客户端绑定运行主机的IP和随机端口//填充服务器的地址信息结构体,给sendto函数使用//要发给谁,就填谁的地址信息struct sockaddr_in sin;sin.sin_family      = AF_INET;      //必须填AF_INETsin.sin_port        = htons(PORT);      //端口号:服务器绑定的端口号                     sin.sin_addr.s_addr = inet_addr(IP);    //IP:服务器绑定的IPchar buf[128] = "";ssize_t res = 0;struct sockaddr_in rcvaddr;     //存储接收到的数据包从哪里来socklen_t addrlen = sizeof(rcvaddr);while(1){bzero(buf, sizeof(buf));printf("请输入>>> ");fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = 0;//发送数据if(sendto(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin,  sizeof(sin)) < 0){ERR_MSG("sendto");return -1;}printf("sendto success\n");//接收数据res = recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&rcvaddr, &addrlen);//res = recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);//res = recv(cfd, buf, sizeof(buf), 0);//res = read(cfd, buf, sizeof(buf));if(res < 0){ERR_MSG("recvfrom");return -1;}printf("[%s : %d] : %s\n", \inet_ntoa(rcvaddr.sin_addr), ntohs(rcvaddr.sin_port), buf);}//关闭文件描述符close(cfd);return 0;
}

3 服务端结果

ubuntu@ubuntu:03_udp$ gcc 01_ser.c -o ser
ubuntu@ubuntu:03_udp$ ./ser
sfd = 3
bind success
[192.168.1.110 : 48368] : 123
sendto success
[192.168.1.110 : 48368] : 123
sendto success
[192.168.1.110 : 48368] : 123
sendto success
[192.168.1.110 : 48368] : 333
sendto success
^C
ubuntu@ubuntu:03_udp$ 

4 客户端结果

ubuntu@ubuntu:03_udp$ gcc 02_cli.c -o cli
ubuntu@ubuntu:03_udp$ ./cli
cfd = 3
请输入>>> 123
sendto success
[192.168.1.110 : 6666] : 123*_*
请输入>>> 123
sendto success
[192.168.1.110 : 6666] : 123*_*
请输入>>> 123
sendto success
[192.168.1.110 : 6666] : 123*_*
请输入>>> 333
sendto success
[192.168.1.110 : 6666] : 333*_*
请输入>>> ^C
ubuntu@ubuntu:03_udp$ 

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

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

相关文章

中国“诺贝尔奖”未来科学大奖公布2023年获奖名单

未来科学大奖委员会于8月16日公布2023年获奖名单。柴继杰、周俭民因发现抗病小体并阐明其结构和在抗植物病虫害中的功能做出的开创性工作获得“生命科学奖”&#xff0c;赵忠贤、陈仙辉因对高温超导材料的突破性发现和对转变温度的系统性提升所做出的开创性贡献获得“物质科学奖…

突破网络编程1024限制的方法(修改配置文件)

文章目录 概述修改linux配置相关命令步骤1. 打开终端2. 使用sudo权限编辑文件3. 添加资源限制配置4. 保存和退出5. 重启系统或重新登录 其他方法1. 使用事件驱动的框架2. 使用连接池3. 负载均衡4. 使用线程池和进程池5. 升级操作系统设置6. 使用专业的高性能服务器7. 分布式架构…

深入源码分析kubernetes informer机制(三)Resync

[阅读指南] 这是该系列第三篇 基于kubernetes 1.27 stage版本 为了方便阅读&#xff0c;后续所有代码均省略了错误处理及与关注逻辑无关的部分。 文章目录 为什么需要resyncresync做了什么 为什么需要resync 如果看过上一篇&#xff0c;大概能了解&#xff0c;client数据主要通…

1、基于 CentOS 7 构建 LVS-DR 群集。 2、配置nginx负载均衡

一、基于CentOS7和、构建LVS-DR群集 准备四台虚拟机 ip作用192.168.27.150客户端192.168.27.151LVS192.168.27.152RS192.168.27.152RS 关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld安装ifconfig yum install net-tools.x86_64 -y1、DS上 1.1 配置LVS虚拟IP …

uniapp开发微信小程序使用painter将页面转换为图片并保存到本地相册

引言 我使用到painter的原因是&#xff0c;在uniapp开发微信小程序时&#xff0c;需要将一个页面的内容转换成图片保存到本地相册。 起初在网上找到很多都是在uniapp中使用 html2canvas 将网页转换成图片再jspdf将图片转换为pdf&#xff0c;但是这种方式在小程序环境不支持&am…

opencv进阶08-K 均值聚类cv2.kmeans()介绍及示例

K均值聚类是一种常用的无监督学习算法&#xff0c;用于将一组数据点分成不同的簇&#xff08;clusters&#xff09;&#xff0c;以便数据点在同一簇内更相似&#xff0c;而不同簇之间差异较大。K均值聚类的目标是通过最小化数据点与所属簇中心之间的距离来形成簇。 当我们要预测…

opencv实现以图搜图

这里写目录标题 1. 步骤1.1 导入OpenCV库&#xff1a;1.2 加载图像1.3 提取特征1.4 匹配特征1.5 显示结果 2. 完整代码3. 测试图片及效果 1. 步骤 1.1 导入OpenCV库&#xff1a; 在您的C代码中&#xff0c;首先需要导入OpenCV库。您可以使用以下语句导入核心模块&#xff1a;…

人工智能算法-SVM, KNN

目录 SVM, KNN区别 一、KNN算法概述 算法的描述: 二、关于K的取值 K的取法: 三、关于距离的选取 Euclidean Distance 定义: 四、总结 SVM, KNN区别

化繁为简,使用Hibernate Validator实现参数校验

前言 在之前的悦享校园的开发中使用了SSM框架&#xff0c;由于当时并没有使用参数参数校验工具&#xff0c;方法的入参判断使用了大量的if else语句&#xff0c;代码十分臃肿&#xff0c;因此最近在重构代码时&#xff0c;将框架改为SpringBoot后&#xff0c;引入了Hibernate V…

有一种新型病毒在 3Ds Max 环境中传播,如何避免?

3ds Max渲染慢&#xff0c;可以使用渲云渲染农场&#xff1a; 渲云渲染农场解决本地渲染慢、电脑配置不足、紧急项目渲染等问题&#xff0c;可批量渲染&#xff0c;批量出结果&#xff0c;速度快&#xff0c;效率高。 此外3dmax支持的CG MAGIC插件专业版正式上线&#xff0c;…

机器学习笔记(1):机器学习入门的概念

导航 一、 人工智能&#xff0c;机器学习&#xff0c;深度学习和传统学习二、数学基础三、编程语言 如果你刚刚入门机器学习&#xff0c;会接触到了非常多的概念。比如人工智能&#xff0c;机器学习&#xff0c;深度学习&#xff0c;神机网络&#xff0c;强化学习&#xff0c;各…

0基础学习VR全景平台篇 第85篇:智慧眼-如何分配角色的权限?

一、功能说明 角色权限&#xff0c;是指给智慧眼的所有角色成员分配具体的操作权限。 二、后台编辑界面 1、点击“添加权限”&#xff0c;选择其可操作的“权限”。注意权限只能逐项选择&#xff0c;所以如果某个角色拥有多项权限的话&#xff0c;那么需要进行多次添加。“快…

uniapp app 实现右上角回首页;点homeButton返回上一页;onNavigationBarButtonTap不生效问题

场景&#xff1a; app&#xff0c;Android移动端 实现点击右上角图标&#xff0c;回首页。 问题&#xff1a;用了官网的 homeButton&#xff0c;图标正常展示了&#xff0c;也可点击&#xff0c;但每次点击后是会返回上一页而非首页。 后来查到说&#xff0c;要结合onNavigatio…

linux两台服务器互相备份文件(sshpass + crontab)

crontab crontab是linux系统自带的定时调度软件&#xff0c;可用于设置周期性被执行的指令&#xff0c;一般用在每天的非高峰负荷时间段运行作业&#xff0c;可在无需人工干预的情况下运行作业。支持在一周或一月中的不同时段运行。 crontab命令允许用户提交、编辑或删除相应的…

滴滴Ceph分布式存储系统优化之锁优化

摘自&#xff1a;https://mp.weixin.qq.com/s/oWujGOLLGItu1Bv5AuO0-A 2020-09-02 21:45 0.引言 Ceph是国际知名的开源分布式存储系统&#xff0c;在工业界和学术界都有着重要的影响。Ceph的架构和算法设计发表在国际系统领域顶级会议OSDI、SOSP、SC等上。Ceph社区得到Red Hat…

Transformers架构系列---transformers库的使用

Transformers最初是由Google发布的论文 Attention is All You Need (2017) 提出的一种新的深度学习网络架构,这篇论文证明了序列模型(如 LSTM)可以完全被注意力机制取代,甚至可以获得更好的性能。Transformers网络结构自2017年提出之后仅仅一两年的时间内就一直在NLP领域及…

Vue:使用Promise.all()方法并行执行多个请求

在Vue中&#xff0c;可以使用Promise.all()方法来并行执行多个请求。当需要同时执行多个异步请求时&#xff0c;可以将这些请求封装为Promise对象并使用Promise.all()方法来执行它们。 示例1&#xff1a; 以下是一个示例代码&#xff0c;展示了如何通过Promise.all()方法并行…

C语言——动态内存管理

动态内存管理详解 前言&#xff1a;一、为什么存在动态内存分配二、动态内存函数2.1malloc函数2.2calloc函数2.3realloc函数2.4free函数 三、常见的动态内存错误3.1 对NULL指针解引用操作3.2 对动态开辟空间的越界访问3.3 对非动态开辟内存使用free释放3.4 使用free释放动态开辟…

Unity UI内存泄漏优化

项目一运行&#xff0c;占用的内存越来越多&#xff0c;不会释放&#xff0c;导致GC越来越频繁&#xff0c;越来越慢&#xff0c;这些都是为什么呢&#xff0c;今天从UI方面谈起。 首先让我们来聊聊什么是内存泄漏呢&#xff1f; 一般来讲内存泄漏就是指我们的应用向内存申请…

Rabbitmq消息不丢失

目录 一、消息不丢失1.消息确认2.消息确认业务封装2.1 发送确认消息测试2.2 消息发送失败&#xff0c;设置重发机制 一、消息不丢失 消息的不丢失&#xff0c;在MQ角度考虑&#xff0c;一般有三种途径&#xff1a; 1&#xff0c;生产者不丢数据 2&#xff0c;MQ服务器不丢数据…