linux c语言 udp收到0x01的消息后发送消息超时5秒总超时20秒未收到0x02重发
时间: 2023-12-06 10:45:29 浏览: 58
udp.rar_linux c语言 udp_udp 多线程_udp c语言 linux_udp linux
以下是一个示例代码,用于实现这个功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/time.h>
#define BUF_SIZE 1024
int main(int argc, char *argv[]) {
int sock;
struct sockaddr_in serv_addr;
struct timeval tv;
fd_set fds;
int fd_max;
char buf[BUF_SIZE];
int len, ret;
if (argc != 3) {
printf("Usage: %s <IP> <PORT>\n", argv[0]);
exit(1);
}
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
perror("socket() error");
exit(1);
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
if (bind(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
perror("bind() error");
exit(1);
}
while (1) {
FD_ZERO(&fds);
FD_SET(sock, &fds);
fd_max = sock + 1;
tv.tv_sec = 5;
tv.tv_usec = 0;
ret = select(fd_max, &fds, NULL, NULL, &tv);
if (ret == -1) {
perror("select() error");
exit(1);
} else if (ret == 0) {
printf("timeout\n");
continue;
}
len = recvfrom(sock, buf, BUF_SIZE - 1, 0, NULL, 0);
if (len == -1) {
perror("recvfrom() error");
exit(1);
}
buf[len] = '\0';
if (buf[0] == 0x01) {
int i;
for (i = 0; i < 4; i++) {
ret = sendto(sock, "Hello!", 6, 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
if (ret == -1) {
perror("sendto() error");
exit(1);
}
tv.tv_sec = 5;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(sock, &fds);
fd_max = sock + 1;
ret = select(fd_max, &fds, NULL, NULL, &tv);
if (ret == -1) {
perror("select() error");
exit(1);
} else if (ret == 0) {
printf("timeout\n");
continue;
}
len = recvfrom(sock, buf, BUF_SIZE - 1, 0, NULL, 0);
if (len == -1) {
perror("recvfrom() error");
exit(1);
}
buf[len] = '\0';
if (buf[0] == 0x02) {
printf("received 0x02, exit\n");
exit(0);
}
}
printf("timeout, exit\n");
exit(1);
}
}
return 0;
}
```
代码中,我们使用 `select` 函数来实现超时等待和检测是否有数据可读。当收到 0x01 消息时,我们发送 "Hello!" 消息并等待回复。如果在 5 秒内收到了 0x02 消息,则程序退出。如果超过 5 秒未收到回复,则重复发送消息,最多重复 4 次,总超时时间为 20 秒。如果还是没有收到 0x02 消息,则程序退出。
阅读全文