组播就是将数据发送到一组主机。接收端如果要接收消息,则需要加入到该分组,分组是用IP来标识的。
从网络协议–UDP协议(1)介绍可以知道,适用于分组的IP有224.0.0.0 ~ 239.255.255.255
。
同样,发送端就需要将数据发送到该分组IP。
一、发送端
#include
#pragma comment(lib, "Ws2_32.lib")
void SendLogic() {
WSADATA wsaData;
WORD wVersiOnRequested= MAKEWORD(1, 0);
WSAStartup(wVersionRequested, &wsaData);
SOCKET socket = ::WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, nullptr, 0, 0);
if (socket == INVALID_SOCKET) {
printf("WSASocket failed, error=%d\n", WSAGetLastError());
return;
}
int broadcast = 1;
int err = setsockopt(socket, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<const char*>(&broadcast), sizeof(int));
if (err == SOCKET_ERROR) {
printf("setsockopt failed, error=%d\n", WSAGetLastError());
return;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6000);
addr.sin_addr.s_addr = inet_addr("225.0.0.37");
char buf[100] = { "hello" };
err = sendto(socket, buf, strlen(buf), 0, reinterpret_cast<const sockaddr*>(&addr), sizeof(addr));
if (err == SOCKET_ERROR) {
printf("sendto failed, error=%d\n", WSAGetLastError());
return;
}
printf("[BROADCAST] %s OK\n", buf);
WSACleanup();
}
int main()
{
SendLogic();
getchar();
return 0;
}
二、接收端
#include
#include
#pragma comment(lib, "Ws2_32.lib")
void RecvLogic() {
WSADATA wsaData;
WORD wVersiOnRequested= MAKEWORD(1, 0);
WSAStartup(wVersionRequested, &wsaData);
SOCKET socket = ::WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, nullptr, 0, 0);
if (socket == INVALID_SOCKET) {
printf("WSASocket failed, error=%d\n", WSAGetLastError());
return;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6000);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
int err = bind(socket, reinterpret_cast<const sockaddr*>(&addr), sizeof(addr));
if (err == SOCKET_ERROR) {
printf("bind failed, error=%d\n", WSAGetLastError());
return;
}
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("225.0.0.37");
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
err = setsockopt(socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, reinterpret_cast<const char*>(&mreq), sizeof(ip_mreq));
if (err == SOCKET_ERROR) {
printf("setsockopt failed, error=%d\n", WSAGetLastError());
return;
}
while (true) {
char buf[100] = { 0 };
int fromlen = sizeof(addr);
err = recvfrom(socket, buf, 100, 0, reinterpret_cast(&addr), &fromlen);
if (err == SOCKET_ERROR) {
printf("recvfrom failed, error=%d\n", WSAGetLastError());
return;
}
printf("[RECV] %s\n", buf);
}
WSACleanup();
}
int main()
{
RecvLogic();
getchar();
return 0;
}