linux c语言 udp收到消息0x0后发送消息超时5秒总超时20秒未收到0x02重发

时间: 2023-12-10 22:42:41 浏览: 32
你可以使用 `select()` 函数来实现超时等待和重发。以下是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/select.h> #define BUF_SIZE 1024 #define SERVER_PORT 8888 int main() { int sockfd; struct sockaddr_in server_addr, client_addr; socklen_t addr_len = sizeof(struct sockaddr_in); char buf[BUF_SIZE]; int ret, recv_len; fd_set read_fds; struct timeval timeout; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); exit(EXIT_FAILURE); } memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); if (ret < 0) { perror("bind"); exit(EXIT_FAILURE); } while (1) { FD_ZERO(&read_fds); FD_SET(sockfd, &read_fds); timeout.tv_sec = 5; timeout.tv_usec = 0; ret = select(sockfd + 1, &read_fds, NULL, NULL, &timeout); if (ret < 0) { if (errno == EINTR) { continue; } perror("select"); exit(EXIT_FAILURE); } else if (ret == 0) { // timeout, send again printf("timeout, send again\n"); ret = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&client_addr, addr_len); if (ret < 0) { perror("sendto"); exit(EXIT_FAILURE); } } else { // receive data recv_len = recvfrom(sockfd, buf, BUF_SIZE, 0, (struct sockaddr *)&client_addr, &addr_len); if (recv_len < 0) { perror("recvfrom"); exit(EXIT_FAILURE); } buf[recv_len] = '\0'; printf("received data: %s\n", buf); if (buf[0] == 0x02) { // received 0x02, break the loop break; } } } close(sockfd); return 0; } ``` 在上面的代码中,我们使用 `select()` 函数来等待数据的到来,如果超时了就重发。如果收到了期望的数据,我们就跳出循环。注意,在重发时我们需要保存客户端的地址信息,以便重新发送数据。 当然,这只是一个示例代码,你需要根据你自己的需求进行修改。

相关推荐

最新推荐

recommend-type

怎么拼接中间有0x00符的字符串(数组)

有的人拼接中间有0x00符的字符串提法实际上是错误的,因为中间有0x00的不能算作字符串,字符串的结束符为0x00,且在最末尾。
recommend-type

C语言编写基于TCP和UDP协议的Socket通信程序示例

主要介绍了C语言编写基于TCP和UDP协议的Socket通信程序示例,其中TCP的客户端与服务器端采用多线程实现,需要的朋友可以参考下
recommend-type

Linux中使用C语言的fork()函数创建子进程的实例教程

fork是一个在Linux系统环境下专有的函数,现有的进程调用fork后将会创建一个新的进程,这里我们就来看一下Linux中使用C语言的fork()函数创建子进程的实例教程
recommend-type

C语言实现Linux下的socket文件传输实例

主要介绍了C语言实现Linux下的socket文件传输的方法,较为详细的分析了C语言文件Socket文件传输客户端与服务器端相关实现技巧,需要的朋友可以参考下
recommend-type

基于Linux操作系统C语言开发的多人聊天室程序设计与实现.docx

里面附有源代码,加上详细的设计步骤,使用了C语言开发,功能有服务器和客户端的消息接收与发送,以及退出功能
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SQL怎么实现 数据透视表

SQL可以通过使用聚合函数和GROUP BY子句来实现数据透视表。 例如,假设有一个销售记录表,其中包含产品名称、销售日期、销售数量和销售额等信息。要创建一个按照产品名称、销售日期和销售额进行汇总的数据透视表,可以使用以下SQL语句: ``` SELECT ProductName, SaleDate, SUM(SaleQuantity) AS TotalQuantity, SUM(SaleAmount) AS TotalAmount FROM Sales GROUP BY ProductName, SaleDate; ``` 该语句将Sales表按照ProductName和SaleDat
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。