linux下c++加入udp组播
时间: 2023-07-03 10:07:18 浏览: 146
在 Linux 下使用 C++ 加入 UDP 组播需要以下步骤:
1. 创建 UDP 套接字
使用 `socket()` 函数创建 UDP 套接字,指定协议族为 `AF_INET`,类型为 `SOCK_DGRAM`,协议为 `0`。
```c++
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
```
2. 设置组播地址
使用 `setsockopt()` 函数设置组播地址和端口号。
```c++
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("组播地址");
addr.sin_port = htons(port);
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &addr, sizeof(addr));
```
其中 `IPPROTO_IP` 表示操作的协议层级,`IP_ADD_MEMBERSHIP` 表示加入组播,`&addr` 是组播地址结构体,`sizeof(addr)` 是结构体大小。
3. 绑定端口号
使用 `bind()` 函数绑定端口号。
```c++
struct sockaddr_in local_addr;
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = INADDR_ANY;
local_addr.sin_port = htons(port);
bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr));
```
其中 `INADDR_ANY` 表示监听所有网络接口。
4. 接收数据
使用 `recvfrom()` 函数接收数据。
```c++
char buf[1024];
struct sockaddr_in remote_addr;
int len = sizeof(remote_addr);
recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&remote_addr, &len);
```
其中 `buf` 是接收数据的缓冲区,`remote_addr` 是发送端地址结构体,`len` 是地址结构体大小。
5. 发送数据
使用 `sendto()` 函数发送数据。
```c++
char buf[] = "Hello, World!";
struct sockaddr_in remote_addr;
remote_addr.sin_family = AF_INET;
remote_addr.sin_addr.s_addr = inet_addr("组播地址");
remote_addr.sin_port = htons(port);
sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&remote_addr, sizeof(remote_addr));
```
其中 `buf` 是发送的数据,`remote_addr` 是组播地址结构体。
完整的代码示例:
```c++
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main()
{
// 创建套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
return -1;
}
// 设置组播地址
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("组播地址");
addr.sin_port = htons(9999);
if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &addr, sizeof(addr)) < 0) {
perror("setsockopt");
return -1;
}
// 绑定端口号
struct sockaddr_in local_addr;
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = INADDR_ANY;
local_addr.sin_port = htons(9999);
if (bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr)) < 0) {
perror("bind");
return -1;
}
// 接收数据
char buf[1024];
struct sockaddr_in remote_addr;
int len = sizeof(remote_addr);
if (recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&remote_addr, &len) < 0) {
perror("recvfrom");
return -1;
}
printf("Received: %s\n", buf);
// 发送数据
char msg[] = "Hello, World!";
if (sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
perror("sendto");
return -1;
}
return 0;
}
```
阅读全文