使用udp进行通信
UDP chat
头文件
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <signal.h>
#include <pthread.h>
服务端server
typedef struct sockaddr *(SA);
int main(int argc,char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");return 1;}struct sockaddr_in server,client;bzero(&server,sizeof(server));bzero(&client,sizeof(client));server.sin_family = AF_INET;server.sin_port = htons(50000);server.sin_addr.s_addr = 0;int ret = bind(sockfd,(SA)&server,sizeof(server));if(-1 == ret){perror("bind");exit(1);}char buf[512] = {0};socklen_t len = sizeof(client);recvfrom(sockfd,buf,sizeof(buf),0,(SA)&client,&len);printf("cli addr:%s port:%s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));pid_t pid = fork();if(pid>0){while(1){bzero(buf,sizeof(buf));recvfrom(sockfd,buf,sizeof(buf),0,(SA)&client,&len);if(0==strcmp(buf,"#quit\n")){kill(pid,2);exit(1);} printf("from cli:%s\n",buf);fflush(stdout);}}else if(0 == pid){while(1){bzero(buf,sizeof(buf));printf("to cli:");fgets(buf,sizeof(buf),stdin);sendto(sockfd,buf,strlen(buf),0,(SA)&client,sizeof(client));if(0 == strcmp(buf,"#quit\n")){kill(getppid(),2);exit(1);}}}else{perror("fork");exit(1);}return 0;}
客户端client
typedef struct sockaddr * (SA);struct sockaddr_in server;
void* th1(void* arg)
{int sockfd = *(int*)arg;while(1){char buf[512]={0};recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);if(0 == strcmp(buf,"#quit\n")){exit(0);}printf("from ser:%s\n",buf);}return NULL;
}
void* th2(void* arg)
{int sockfd = *(int*)arg;while(1){char buf[512]={0};printf("to ser:");fgets(buf,sizeof(buf),stdin);sendto(sockfd,buf,strlen(buf),0,(SA)&server,sizeof(server));if(0 == strcmp("#quit\n",buf)){exit(0);}}return NULL;
}int main(int argc, char *argv[])
{int sockfd =socket(AF_INET,SOCK_DGRAM ,0);if(-1 == sockfd){perror("socket");return 1;}//set ip port man 7 ip bzero(&server,sizeof(server));server.sin_family = AF_INET;server.sin_port = htons(50000);// >50000 host to net short server.sin_addr.s_addr =0;char buf[512]="@_@";sendto(sockfd,buf,strlen(buf),0,(SA)&server,sizeof(server));pthread_t tid1,tid2;pthread_create(&tid1,NULL,th1,&sockfd);pthread_create(&tid2,NULL,th2,&sockfd);pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}
函数
socket
int socket(int domain, int type, int protocol);
domain
: 指定通信协议族,这里使用的是AF_INET
,表示使用IPv4协议。type
: 指定套接字类型,SOCK_DGRAM
表示使用数据报套接字,也就是UDP协议。protocol
: 通常为0
,表示选择默认协议,对于SOCK_DGRAM
来说,默认的协议就是UDP。
创建udp套接字 int sockfd = socket(AF_INET, SOCK_DGRAM, 0)
sockfd = socket(int socket_family, int socket_type, int protocol);
bzero
bzero
是一个用于将指定内存区域清零的函数,通常用于初始化数据结构,以确保它们不包含任何未初始化的数据。
void bzero(void *s, size_t n);
s
: 指向需要清零的内存区域的指针。n
: 要清零的字节数。
bzero
将从指针s
所指向的内存区域开始的n
个字节全部设置为零。
struct sockaddr_in server;
bzero(&server, sizeof(server));
bzero
在网络编程中初始化 sockaddr_in
结构体:
bzero
将 server
结构体的所有字节都设置为零,确保其中的每个字段都被正确初始化。使用 bzero
比逐个字段手动初始化要简单得多。
sendto
sendto
是一个用于发送数据到指定目标地址的函数,常用于UDP(数据报套接字)的网络编程。与TCP不同,UDP是无连接的协议,使用sendto
函数可以在不建立连接的情况下发送数据。
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
sockfd
: 套接字文件描述符,表示通过哪个套接字发送数据。buf
: 指向要发送的数据的指针。len
: 要发送的数据的长度(字节数)。flags
: 一般设置为0
,除非需要设置特殊的发送选项。dest_addr
: 指向目的地址的指针,即目标主机的地址和端口信息。这个地址通常使用sockaddr_in
结构体表示。addrlen
:dest_addr
结构体的大小,通常使用sizeof(struct sockaddr_in)
。
recvfrom
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
sockfd
: 套接字文件描述符,指定从哪个套接字接收数据。buf
: 指向接收数据的缓冲区指针。len
: 缓冲区的大小(字节数),即可以接收的最大数据量。flags
: 通常设置为0
,除非需要特殊的接收行为(如非阻塞模式)。src_addr
: 用于存储发送方的地址信息的结构体指针(通常是sockaddr_in
类型)。如果不关心发送方地址,可以设置为NULL
。addrlen
: 一个指向socklen_t
类型变量的指针,用于存储发送方地址的长度。如果src_addr
是NULL
,这个参数可以忽略。
bind
bind
函数在网络编程中用于将一个套接字(socket)绑定到一个特定的IP地址和端口号上。通常在服务器端程序中使用,以指定该服务器在某个IP地址和端口上监听客户端的连接或数据。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd
: 套接字文件描述符,指示要绑定的套接字。addr
: 指向包含IP地址和端口信息的sockaddr
结构体的指针。对于IPv4,通常使用sockaddr_in
结构体来表示。addrlen
:addr
结构体的大小,通常使用sizeof(struct sockaddr_in)
。
- 服务器端:
bind
是服务器端程序中必须的步骤之一,它将服务器的套接字绑定到一个特定的IP地址和端口上,以便客户端能够通过这个地址和端口与服务器通信。 - 客户端:对于客户端程序,通常不需要手动调用
bind
,因为系统会自动为客户端分配一个临时端口。然而,如果客户端希望指定特定的源IP地址或端口,也可以使用bind
。
相关文章:
使用udp进行通信
UDP chat 头文件 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <time…...

C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作
C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作 一、使用Microsoft.Office.Interop.Excel库 1、通过NuGet包管理器添加引用 按照下图中红框所示进行操作。 需要安装Microsoft.Office.Interop.Excel包 添加Microsoft Office 16.0 Object …...

java重点学习-redis
一.redis 穿透无中生有key,布隆过滤nul隔离 锁与非期解难题。缓存击穿过期key, 雪崩大量过期key,过期时间要随机。 面试必考三兄弟,可用限流来保底。 1.1 Redis的使用场景 根据自己简历上的业务进行回答 缓存穿透、击穿、雪崩、双…...

每日刷题(图论)
P1119 灾后重建 P1119 灾后重建 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 看数据范围知道需要用到Floyd算法,但是道路是不能直接用的,需要等到连接道路的两个村庄重建好才可以使用,所以这需要按照时间依次加入中转点,…...

Requestium - 将Requests和Selenium合并在一起的自动化测试工具
Requests 是 Python 的第三方库,主要用于发送 http 请求,常用于接口自动化测试等。 Selenium 是一个用于 Web 应用程序的自动化测试工具。Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。 本篇介绍一款将 Requests 和 Seleniu…...

mysql和pg等数据库之间的数据迁移实战分享
mysql和pg等数据库之间的数据迁移是常见的问题:比如一开始使用Oracle,后来想使用mysql,而且需要把Oracle数据库的数据迁移到mysql里面;后期有想使用pg数据库,同时需要把Mysql数据库的数据迁移到pgl里面,等等…...

消息中间件都有哪些
RabbitMQ:这可是一个开源的消息代理软件,也叫消息中间件。它支持多种消息传递协议,可以轻松地在分布式系统中进行可靠的消息传递。 Kafka:Apache Kafka是一个分布式流处理平台,它主要用于处理实时数据流。Kafka的设计初…...
数据结构(3)内核链表
一、内核链表 内核链表是一种在操作系统内核中使用的数据结构,主要用于管理和组织内核对象。它是有头双向链表的一种实现。 内核链表的特点 双向链表: 内核链表的每个节点都包含指向前一个节点和后一个节点的指针,这使得在链表中进行插入和删除操作时更…...

Linux 硬件学习 s3c2440 arm920t蜂鸣器
1.查找手册时钟图,输入12m想要通过pll得到400m的信号 2.对比pll值,找到最近的为405,得到pll中mdiv为127,pdiv为2,sdiv为1 3.想要得到fclk400,hclk100,pclk50,对比分频比例࿰…...
提交保存,要做重复请求拦截,避免出现重复保存的问题
**问题:**前端ajax提交数据的时候,当频繁点击的时候,或者两个账号以相同数据创建的时候,会出现问题。 **处理办法:**前端拦截,防止重复提交数据,在上一次请求返回结果之后才允许提交第二次&…...
华为 HCIP-Datacom H12-821 题库 (3)
有需要题库的可以看主页置顶 1.运行 OSPF 协议的路由器在交互 DD 报文时,会使用以下哪一个参数选举主从关系? A、接口的 IP 地址 B、接口的 DR 优先级 C、Area ID D、Router ID 答案:D 解析: Router-ID 大的为主&a…...
spring-boot 事件
事件触发时机常用监听器描述ApplicationStartingEvent应用启动时LoggingApplicationListener:决定加载哪个日志系统ApplicationEnvironmentPreparedEvent创建Environment之后BootstrapApplicationListener:加载spring-cloud bootstrap配置文件࿱…...

合碳智能 × Milvus:探索化学合成新境界——逆合成路线设计
合碳智能(C12.ai)成立于2022年,致力于运用AI和具身智能技术,为药物研发实验室提供新一代智能化解决方案,推动实验室从自动化迈向智能化,突破传统实验模式与人员的依赖,解决效率和成本的瓶颈&…...

二分查找 | 二分模板 | 二分题目解析
1.二分查找 二分查找的一个前提就是要保证数组是有序的(不准确)!利用二段性! 1.朴素二分模板 朴素二分法的查找中间的值和目标值比较 while(left < right) // 注意是要: < {int mid left (right -left) / 2;…...

uni-app应用更新(Android端)
关于app更新,uni-app官方推荐的是 uni-upgrade-center,看了下比较繁琐,因此这里自己实现检查更新并下载安装的逻辑。 1.界面效果 界面中的弹框和 进度条采用了uView 提供的组件 2.检查更新并下载安装 一、版本信息配置在服务端,…...

JavaEE(2):前后端项目之间的交互
现在,在网页中通过超链接,表单就可以向后端发送请求,后端也可以正常响应内容。 以前通过表单访问后端的请求方式称为同步请求 同步请求 当网页与后端交互时,前端不能再进行其他操作 服务器端响应回来的内容,会把整个浏…...

(已开源-CVPR 2024)YOLO-World: Real-Time Open-Vocabulary Object Detection
169期《YOLO-World Real-Time Open-Vocabulary Object Detection》 You Only Look Once (YOLO) 系列检测模型是目前最常用的检测模型之一。然而,它们通常是在预先定义好的目标类别上进行训练,很大程度上限制了它们在开放场景中的可用性。为了解决这一限制…...

Spring6梳理4——SpringIoC容器
以上笔记来源: 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 4.1 前言 4.2 IoC容器 4.2.1 控制反转(IoC) 4.2.2 依赖注入 4.2.3 IoC容器在Spri…...

SpringBoot2:请求处理原理分析-FORM表单请求接口
一、RESTFUL简介 Rest风格支持(使用HTTP请求方式,动词来表示对资源的操作) 以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在: /user GET-获取用户 DELETE-删除用户 PUT-修改…...
Monkey日志ANR、CRASH、空指针异常及其他异常数据分析
引言 在Android开发过程中,monkey测试是一种常用的随机测试手段,用于模拟用户的各种操作来发现应用中的稳定性问题。通过monkey测试生成的日志文件包含了丰富的信息,包括应用程序崩溃(Crash)、无响应(ANR&…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...