windows 设置网卡接受组播 win32 socket 代码例子
时间: 2024-05-05 18:19:46 浏览: 29
以下是一个简单的Win32 Socket代码示例,用于在Windows上设置网卡以接受组播消息:
```c++
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <iostream>
#pragma comment(lib, "Ws2_32.lib")
int main() {
// 初始化 Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
std::cerr << "WSAStartup failed: " << iResult << std::endl;
return 1;
}
// 创建套接字
SOCKET socketFd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (socketFd == INVALID_SOCKET) {
std::cerr << "socket creation failed: " << WSAGetLastError() << std::endl;
WSACleanup();
return 1;
}
// 允许多个套接字绑定到同一地址
BOOL bOptVal = TRUE;
iResult = setsockopt(socketFd, SOL_SOCKET, SO_REUSEADDR, (char*)&bOptVal, sizeof(BOOL));
if (iResult == SOCKET_ERROR) {
std::cerr << "setsockopt SO_REUSEADDR failed: " << WSAGetLastError() << std::endl;
closesocket(socketFd);
WSACleanup();
return 1;
}
// 绑定套接字到本地地址
sockaddr_in localAddr;
localAddr.sin_family = AF_INET;
localAddr.sin_port = htons(12345); // 绑定到本地端口12345
localAddr.sin_addr.s_addr = INADDR_ANY;
iResult = bind(socketFd, (sockaddr*)&localAddr, sizeof(localAddr));
if (iResult == SOCKET_ERROR) {
std::cerr << "bind failed: " << WSAGetLastError() << std::endl;
closesocket(socketFd);
WSACleanup();
return 1;
}
// 加入多播组
ip_mreq mreq;
inet_pton(AF_INET, "239.255.255.250", &mreq.imr_multiaddr.s_addr); // 组播组地址
mreq.imr_interface.s_addr = INADDR_ANY; // 本地接口地址
iResult = setsockopt(socketFd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(ip_mreq));
if (iResult == SOCKET_ERROR) {
std::cerr << "setsockopt IP_ADD_MEMBERSHIP failed: " << WSAGetLastError() << std::endl;
closesocket(socketFd);
WSACleanup();
return 1;
}
// 接收数据
char buf[1024];
sockaddr_in remoteAddr;
int addrLen = sizeof(remoteAddr);
iResult = recvfrom(socketFd, buf, sizeof(buf), 0, (sockaddr*)&remoteAddr, &addrLen);
if (iResult == SOCKET_ERROR) {
std::cerr << "recvfrom failed: " << WSAGetLastError() << std::endl;
closesocket(socketFd);
WSACleanup();
return 1;
}
// 处理接收到的数据
std::cout << "Received " << iResult << " bytes from " << inet_ntoa(remoteAddr.sin_addr) << std::endl;
std::cout << "Data: " << buf << std::endl;
// 关闭套接字
closesocket(socketFd);
WSACleanup();
return 0;
}
```
在上面的示例中,我们创建了一个UDP套接字并将其绑定到本地地址和端口。然后,我们使用`setsockopt`函数将其加入到组播组中。最后,我们使用`recvfrom`函数接收来自组播组的数据包。注意,你需要将组播地址和本地接口地址替换为你需要的地址。
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)