udp接收结构体数据
时间: 2023-06-22 16:25:52 浏览: 98
在使用UDP协议接收结构体数据时,需要先接收二进制数据,然后将其反序列化为结构体数据。以下是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8888
typedef struct {
int id;
char name[20];
float score;
} Student;
int main() {
// 创建UDP socket
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
exit(1);
}
// 绑定本地地址
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(SERVER_PORT);
if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind");
exit(1);
}
// 接收数据
char buf[sizeof(Student)];
struct sockaddr_in clientaddr;
socklen_t addrlen = sizeof(clientaddr);
if (recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&clientaddr, &addrlen) < 0) {
perror("recvfrom");
exit(1);
}
// 将二进制数据反序列化为结构体数据
Student stu;
memcpy(&stu, buf, sizeof(stu));
printf("Received from %s:%d: id=%d, name=%s, score=%.1f\n",
inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port),
stu.id, stu.name, stu.score);
// 关闭socket
close(sockfd);
return 0;
}
```
在上面的示例代码中,我们先创建了一个UDP socket,并将其绑定到本地地址。然后通过 `recvfrom` 函数接收数据,接收到的数据为二进制数据。我们将其反序列化为结构体数据,并输出接收到的数据。注意,我们在输出客户端地址时,需要使用 `inet_ntoa` 函数将IP地址转换为字符串形式。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)