linux c语言 udp收到0x01的消息后发送消息超时5秒总超时20秒未收到0x02重发
时间: 2023-12-10 18:42:36 浏览: 84
实现这个功能的话,可以使用socket进行UDP通信,然后使用select函数来实现超时等待。具体步骤如下:
1. 创建UDP套接字并绑定到指定的端口。
```
int sockfd;
struct sockaddr_in servaddr, cliaddr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
```
2. 使用select函数进行超时等待,等待5秒钟来接收消息。如果接收到了0x01的消息,则设置一个计时器,等待20秒钟来接收0x02的消息,如果20秒钟内未收到,则重新发送0x01。
```
fd_set rfds;
struct timeval tv;
int retval;
char buf[1024];
int n;
while(1) {
FD_ZERO(&rfds);
FD_SET(sockfd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
retval = select(sockfd+1, &rfds, NULL, NULL, &tv);
if (retval == -1) {
perror("select()");
} else if (retval) {
n = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));
if (buf[0] == 0x01) {
// 接收到0x01的消息,设置计时器等待20秒钟接收0x02的消息
tv.tv_sec = 20;
tv.tv_usec = 0;
FD_ZERO(&rfds);
FD_SET(sockfd, &rfds);
retval = select(sockfd+1, &rfds, NULL, NULL, &tv);
if (retval == -1) {
perror("select()");
} else if (retval) {
n = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));
if (buf[0] == 0x02) {
// 接收到0x02的消息,继续下一步操作
break;
}
} else {
// 20秒钟内未收到0x02的消息,重新发送0x01
sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));
}
}
} else {
// 超时未收到消息,重新发送0x01
sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));
}
}
```
3. 当接收到0x02的消息后,跳出循环,继续下一步操作。
这样就实现了收到0x01的消息后发送消息超时5秒总超时20秒未收到0x02重发的功能。
阅读全文