C++ implements the sending and receiving ends of multicast and broadcast

  1. broadcast
    • Receiving end
    #include <iostream>
    #include <WinSock2.h>
    #include <WS2tcpip.h>
    #include <vector>
    #include "MsgDefForDataServer23Tai.h"
    #include "LocatorData.h"
    
    #pragma comment(lib, "ws2_32.lib")
    using namespace PT_TAI;
    
    int main()
    {<!-- -->
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), & amp;wsaData);
    if (iResult != 0) {<!-- -->
    std::cout << "WSAStartup failed: " << iResult << std::endl;
    return 1;
    }
    
    SOCKET recvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (recvSocket == INVALID_SOCKET) {<!-- -->
    std::cout << "socket failed with error: " << WSAGetLastError() << std::endl;
    WSACleanup();
    return 1;
    }
    
    sockaddr_in recvAddr;
    recvAddr.sin_family = AF_INET;
    recvAddr.sin_port = htons(9632);
    recvAddr.sin_addr.s_addr = INADDR_ANY;
    
    iResult = bind(recvSocket, (sockaddr*) & amp;recvAddr, sizeof(recvAddr));
    if (iResult == SOCKET_ERROR) {<!-- -->
    std::cout << "bind failed with error: " << WSAGetLastError() << std::endl;
    closesocket(recvSocket);
    WSACleanup();
    return 1;
    }
    
    // char recvBuf[1024] = { 0 };
    // char recvBuf[11 * 1024] = { 0 };
    char recvBuf[11 * 1603] = {<!-- --> 0 };
    int recvBufLen = sizeof(recvBuf);
    struct sockaddr_in senderAddr;
    int senderAddrLen = sizeof(senderAddr);
    
    while (true) {<!-- -->
    iResult = recvfrom(recvSocket, recvBuf, recvBufLen, 0, (struct sockaddr*) & amp;senderAddr, & amp;senderAddrLen);
    if (iResult == SOCKET_ERROR) {<!-- -->
    std::cout << "recvfrom failed with error: " << WSAGetLastError() << std::endl;
    closesocket(recvSocket);
    WSACleanup();
    continue;
    // return 1;
    }
    
    std::vector<ST_DATA_SEND> vecValue;
    std::string strReceiveData;
    strReceiveData.resize(iResult);
    std::memcpy((void*)strReceiveData.data(), recvBuf, iResult);
    int nSize = CCLocatorData->DeserializeResult(strReceiveData, vecValue);
    std::cout << "--------------------------------------------- -------------" << std::endl;
    for (auto Item : vecValue)
    {<!-- -->
    std::cout << static_cast<int>(Item.iVersion) << "\t" << Item.szDeviceID << std::endl;
    }
    
    std::cout << "Received " << iResult << " bytes: " << recvBuf << " from " << inet_ntoa(senderAddr.sin_addr) << std::endl;
    }
    
    closesocket(recvSocket);
    WSACleanup();
    
    return 0;
    }
    
    
  • sending end
 #include <iostream>
   #include <WinSock2.h>
   #include <WS2tcpip.h>
   
   #pragma comment(lib, "ws2_32.lib")
   
   int main()
   {<!-- -->
   WSADATA wsaData;
   int iResult = WSAStartup(MAKEWORD(2, 2), & amp;wsaData);
   if (iResult != 0) {<!-- -->
   std::cout << "WSAStartup failed: " << iResult << std::endl;
   return 1;
   }
   
   SOCKET sendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
   if (sendSocket == INVALID_SOCKET) {<!-- -->
   std::cout << "socket failed with error: " << WSAGetLastError() << std::endl;
   WSACleanup();
   return 1;
   }
   
   BOOL broadcast = TRUE;
   iResult = setsockopt(sendSocket, SOL_SOCKET, SO_BROADCAST, (char*) & amp;broadcast, sizeof(broadcast));
   if (iResult == SOCKET_ERROR) {<!-- -->
   std::cout << "setsockopt failed with error: " << WSAGetLastError() << std::endl;
   closesocket(sendSocket);
   WSACleanup();
   return 1;
   }
   
   sockaddr_in sendAddr;
   sendAddr.sin_family = AF_INET;
   sendAddr.sin_port = htons(9632);
   inet_pton(AF_INET, "255.255.255.255", & amp;(sendAddr.sin_addr));
   
   const char* sendData = "Hello, broadcast!";
   int sendDataLen = strlen(sendData);
   
   while (true) {<!-- -->
   iResult = sendto(sendSocket, sendData, sendDataLen, 0, (sockaddr*) & amp;sendAddr, sizeof(sendAddr));
   if (iResult == SOCKET_ERROR) {<!-- -->
   std::cout << "sendto failed with error: " << WSAGetLastError() << std::endl;
   closesocket(sendSocket);
   WSACleanup();
   return 1;
   }
   
   std::cout << "Sent " << iResult << " bytes: " << sendData << std::endl;
   Sleep(1000); //Send data every 1 second
   }
   
   closesocket(sendSocket);
   WSACleanup();
   
   return 0;
   }
  1. multicast
  • sending end
 #include <iostream>
#include <cstring>
#include <WinSock2.h>
#include <WS2tcpip.h>
\t
#pragma comment(lib, "ws2_32.lib")
\t
int main() {<!-- -->
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), & amp;wsaData) != 0) {<!-- -->
std::cerr << "Failed to initialize winsock" << std::endl;
return 1;
}
\t
SOCKET sockfd;
struct sockaddr_in addr;
const char* group = "239.0.0.1";
const int port = 8888;
\t
//Create UDP socket
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == INVALID_SOCKET) {<!-- -->
std::cerr << "Failed to create socket" << std::endl;
WSACleanup();
return 1;
}
\t
//Set multicast address and port
memset( & amp;addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(group);
addr.sin_port = htons(port);
\t
std::string message = "Hello, multicast!";
\t
while (true) {<!-- -->
\t\t\t// Send a message
if (sendto(sockfd, message.c_str(), message.size(), 0, (struct sockaddr*) & amp;addr, sizeof(addr)) == SOCKET_ERROR) {<!-- -->
std::cerr << "Failed to send message" << std::endl;
closesocket(sockfd);
WSACleanup();
return 1;
}
\t
std::cout << "Message sent" << std::endl;
\t
Sleep(1000); // Pause for 1 second
}
\t
//Close socket
closesocket(sockfd);
WSACleanup();
\t
return 0;
}
  • Receiving end
 #include <iostream>
#include <cstring>
#include <WinSock2.h>
#include <WS2tcpip.h>
\t
#pragma comment(lib, "ws2_32.lib")
\t
int main() {<!-- -->
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), & amp;wsaData) != 0) {<!-- -->
std::cerr << "Failed to initialize winsock" << std::endl;
return 1;
}
\t
SOCKET sockfd;
struct sockaddr_in addr;
const char* group = "239.0.0.1";
const int port = 8888;
\t
//Create UDP socket
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == INVALID_SOCKET) {<!-- -->
std::cerr << "Failed to create socket" << std::endl;
WSACleanup();
return 1;
}
\t
//Set multicast address and port
memset( & amp;addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
\t
// Bind the socket to the local address and port
if (bind(sockfd, (struct sockaddr*) & amp;addr, sizeof(addr)) == SOCKET_ERROR) {<!-- -->
std::cerr << "Failed to bind socket" << std::endl;
closesocket(sockfd);
WSACleanup();
return 1;
}
\t
// Join the multicast group
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(group);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*) & amp;mreq, sizeof(mreq)) == SOCKET_ERROR) {<!-- -->
std::cerr << "Failed to join multicast group" << std::endl;
closesocket(sockfd);
WSACleanup();
return 1;
}
\t
char buffer[1024];
struct sockaddr_in senderAddr;
int senderAddrLen = sizeof(senderAddr);
\t
while (true) {<!-- -->
//Receive message
int numBytes = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*) & amp;senderAddr, & amp;senderAddrLen);
if (numBytes == SOCKET_ERROR) {<!-- -->
std::cerr << "Failed to receive message" << std::endl;
closesocket(sockfd);
WSACleanup();
return 1;
}
\t
buffer[numBytes] = '\0';
std::cout << "Received message from " << inet_ntoa(senderAddr.sin_addr) << ": " << buffer << std::endl;
}
\t
//Close socket
closesocket(sockfd);
WSACleanup();
\t
return 0;
}