回调函数订阅的是自定义消息类型时,如何将该消息通过udp通信发送(c++)
时间: 2023-05-30 08:07:30 浏览: 96
在使用UDP通信时,需要创建一个UDP套接字并设置发送方的IP地址和端口号。然后以二进制格式将自定义消息类型序列化为字符数组,并使用UDP套接字发送该字符数组。接收方也需要创建一个UDP套接字并设置自己的IP地址和端口号,然后使用UDP套接字接收字符数组,并将其反序列化为自定义消息类型。
以下是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define PORT 8888
// 自定义消息类型
typedef struct {
int id;
char name[20];
float score;
} Message;
// 回调函数
void callback(Message msg) {
// 创建UDP套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
exit(1);
}
// 设置发送方的IP地址和端口号
struct sockaddr_in dest_addr;
memset(&dest_addr, 0, sizeof(dest_addr));
dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
dest_addr.sin_port = htons(PORT);
// 将自定义消息类型序列化为字符数组
char buf[1024];
memset(buf, 0, sizeof(buf));
memcpy(buf, &msg, sizeof(msg));
// 发送消息
sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
// 关闭UDP套接字
close(sockfd);
}
int main() {
// 创建UDP套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
exit(1);
}
// 设置自己的IP地址和端口号
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(PORT);
// 绑定UDP套接字
if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");
exit(1);
}
while (1) {
// 接收消息
char buf[1024];
memset(buf, 0, sizeof(buf));
recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);
// 将字符数组反序列化为自定义消息类型
Message msg;
memcpy(&msg, buf, sizeof(msg));
// 处理消息
printf("Received message: id=%d, name=%s, score=%.2f\n", msg.id, msg.name, msg.score);
}
// 关闭UDP套接字
close(sockfd);
return 0;
}
```
阅读全文