拿来即用的组播发送接收程序

简介: 拿来即用的组播发送接收程序

前情提要:windows下程序,客户端服务端是同一个程序(不区分客户端服务端),在接收的程序中注释掉发送代码即可。

#include <iostream>
#include <winsock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#pragma comment (lib, "Ws2_32.lib")
#define DEFAULT_BUFLEN 512
using namespace std;
int main()
{
  //Declare and initialize variables
  WSADATA wsaData = { 0 };
  int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
  if (iResult != 0) {
    wprintf(L"WSAStartup failed: %d\n", iResult);
    return -1;
  }
  //创建socket
  SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if (sock == INVALID_SOCKET) {
    wprintf(L"socket function failed with error = %d\n", WSAGetLastError());
    WSACleanup();
    return -1;
  }
  //设置组播选项
  int opt = 1;
  setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt));
  setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (const char*)&opt, sizeof(opt));
  //IP_MULTICAST_LOOP选项默认为1,表示可以收到自己发的数据,这里设置为0不收自己的数据
  opt = 0;
  setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP, (const char*)&opt, sizeof(opt));
  struct sockaddr_in local_addr;
  memset(&local_addr, 0, sizeof(local_addr));
  local_addr.sin_family = AF_INET;
  local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  local_addr.sin_port = htons(12345);
  if (bind(sock, (struct sockaddr*)&local_addr, sizeof(local_addr)) == SOCKET_ERROR) {
    // 绑定失败
    return -1;
  }
  //加入组播组
  struct ip_mreq mreq;
  mreq.imr_multiaddr.s_addr = inet_addr("239.0.0.1"); // 组播地址
  mreq.imr_interface.s_addr = htonl(INADDR_ANY); // 本地地址
  if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&mreq, sizeof(mreq)) < 0) {
    // 加入组播组失败
    return -1;
  }
  //向组播地址发送数据
  struct sockaddr_in group_addr;
  memset(&group_addr, 0, sizeof(group_addr));
  group_addr.sin_family = AF_INET;
  group_addr.sin_addr.s_addr = inet_addr("239.0.0.1"); // 组播地址
  group_addr.sin_port = htons(12345);
  //*******接受的程序中,注释掉下面的发送即可*****
  char buf[1024];
  strcpy_s(buf, "Hello, World!");
  int n = sendto(sock, buf, strlen(buf), 0, (struct sockaddr*)&group_addr, sizeof(group_addr));
  if (n < 0) {
    // 发送失败
    return -1;
  }
  memset(buf, '\0', 1024);
  struct sockaddr_in sender_addr;
  int addr_len = sizeof(sender_addr);
  n = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr*)&sender_addr, &addr_len);
  if (n < 0) {
    return -1;
  }
  printf("recv: %s\n", buf);
  // 处理接收到的数据
  closesocket(sock);
  WSACleanup();
  system("pause");
  return 0;
}
相关文章
|
网络协议 网络架构
数据从发出到接收的细节介绍{封装与解封装}
本文将介绍了详细的封装在每一层的具体的操作,可以让大家学习到数据从发出到收到的具体过程。
|
6月前
|
网络协议 网络虚拟化
解析接收网络包的过程
【8月更文挑战第6天】IP层->TCP层->Socket层
|
存储 监控 Cloud Native
剖析Linux网络包接收过程:掌握数据如何被捕获和分发的全过程(上)
剖析Linux网络包接收过程:掌握数据如何被捕获和分发的全过程
|
9月前
|
安全 Java Go
springboot+netty化身Udp服务端,go化身客户端模拟设备实现指令联动
springboot+netty化身Udp服务端,go化身客户端模拟设备实现指令联动
208 0
|
9月前
Socket网络编程练习题二:客户端发送一条数据,接收服务端反馈的消息并打印;服务端接收数据并打印,再给客户端反馈消息
Socket网络编程练习题二:客户端发送一条数据,接收服务端反馈的消息并打印;服务端接收数据并打印,再给客户端反馈消息
|
存储 网络协议 Linux
剖析Linux网络包接收过程:掌握数据如何被捕获和分发的全过程(下)
剖析Linux网络包接收过程:掌握数据如何被捕获和分发的全过程
|
消息中间件 定位技术 调度
《移动互联网技术》第八章 消息与服务:掌握不同类型广播监听方式,以及创建通知的方法
《移动互联网技术》第八章 消息与服务:掌握不同类型广播监听方式,以及创建通知的方法
77 0
|
存储 测试技术 C语言
西门子S7-200 SMART自由口通信参数如何设置?如何编写发送程序和接收程序?如何测试?
西门子S7-200 SMART除了支持以太网通信,还可以通过CPU上或信号板上的RS485接口实现串口通信。支持的串口协议,包括自由口协议、USS协议、MODBUS协议和PPI协议。STEP7 Micro/WIN SMART编程软件安装时自动集成串口通信所需要的功能块和子程序。
西门子S7-200 SMART自由口通信参数如何设置?如何编写发送程序和接收程序?如何测试?
|
Java Maven
java实现发送接收邮件的功能(详细代码步骤和jar包)
可以通过java代码发送A邮箱发送到B邮箱。
558 0
java实现发送接收邮件的功能(详细代码步骤和jar包)