服务端
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WS2tcpip.h>
#include <WinSock2.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main()
{
WSADATA wsaData = { 0 };
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET serverSocket = socket(AF_INET, SOCK_DGRAM, 0);
//SOCKADDR_IN serverSockAddr_in = { 0 };
//serverSockAddr_in.sin_family = AF_INET;
//serverSockAddr_in.sin_addr.S_un.S_addr = INADDR_ANY; //自动选择本地任意IP
//serverSockAddr_in.sin_port = htons(6666);
//bind(serverSocket, (SOCKADDR*)&serverSockAddr_in, sizeof(serverSockAddr_in)); //不接收消息就没必要绑定
//组播地址
SOCKADDR_IN multicastSockAddr_in = { 0 };
multicastSockAddr_in.sin_family = AF_INET;
multicastSockAddr_in.sin_addr.S_un.S_addr = inet_addr("239.0.0.0");
multicastSockAddr_in.sin_port = htons(6666);
IP_MREQ ip_mreq = {0};
ip_mreq.imr_multiaddr = multicastSockAddr_in.sin_addr;
ip_mreq.imr_interface = IN_ADDR{INADDR_ANY}; //serverSockAddr_in.sin_addr;
//设置发送端套接字具有组播权限
setsockopt(serverSocket, IPPROTO_IP, IP_MULTICAST_IF, (char*)&ip_mreq, sizeof(ip_mreq));
while (true)
{
cout << "输入内容:";
char sendStr[100] = { 0 };
cin >> sendStr;
sendto(serverSocket, sendStr, sizeof(sendStr) - 1, 0, (SOCKADDR*)&multicastSockAddr_in, sizeof(multicastSockAddr_in));
//char recvStr[100] = { 0 };
//recvfrom(serverSocket, recvStr, sizeof(recvStr) - 1, 0, 0, 0);
//cout << "收到消息:" << recvStr << endl;
}
return 0;
}
客户端
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#include <iostream>
int main()
{
WSADATA wsaData = { 0 };
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET clientSocket = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN clientSockAddr_in = { 0 };
clientSockAddr_in.sin_family = AF_INET;
clientSockAddr_in.sin_addr.S_un.S_addr = INADDR_ANY;
clientSockAddr_in.sin_port = htons(6666);
int bindRet = bind(clientSocket, (SOCKADDR*)&clientSockAddr_in, sizeof(clientSockAddr_in));
if (bindRet == SOCKET_ERROR)
{
std::cout << "绑定套接字失败\n";
closesocket(clientSocket);
WSACleanup();
system("pause");
return 0;
}
//组播地址
SOCKADDR_IN multicastSockAddr_in = { 0 };
multicastSockAddr_in.sin_family = AF_INET;
multicastSockAddr_in.sin_addr.S_un.S_addr = inet_addr("239.0.0.0");
multicastSockAddr_in.sin_port = htons(6666);
IP_MREQ ip_mreq = { 0 };
ip_mreq.imr_multiaddr = multicastSockAddr_in.sin_addr;
ip_mreq.imr_interface = clientSockAddr_in.sin_addr;
//将本机IP加入组播地址
int setsockoptRet = setsockopt(clientSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&ip_mreq, sizeof(ip_mreq));
while(true)
{
char recvStr[100] = { 0 };
SOCKADDR_IN fromSockAddr_in = {0};
int len = sizeof(fromSockAddr_in);
recvfrom(clientSocket, recvStr, sizeof(recvStr) - 1, 0, (SOCKADDR*)&fromSockAddr_in,&len);
std::cout <<"("<< inet_ntoa(fromSockAddr_in.sin_addr)<<":"<<ntohs(fromSockAddr_in.sin_port)<<"):"<<recvStr<<std::endl;
}
return 0;
}