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

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

前情提要: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;
}
相关文章
|
Web App开发 安全 数据安全/隐私保护
IP电话交换机WebRTC使用方法一
WebRTC 简介 WebRTC 是网络实时通信的缩写(Web Real-Time Communication), 是一种支 持网页浏览器进行实时语音通话的技术。在 CooVox V2 IP PBX电话交换机 中成功运用该技术实现网 页分机,为企业用户提供了一个直接与客户沟通交流的免费平台。网页分机是指在 Web 浏览器中通过使用 WebRTC 的方式注册的分机号。客户可以通过企业网站直接与企业人员 通话寻求支持。
|
4月前
|
网络协议 网络虚拟化
解析接收网络包的过程
【8月更文挑战第6天】IP层->TCP层->Socket层
|
存储 监控 Cloud Native
剖析Linux网络包接收过程:掌握数据如何被捕获和分发的全过程(上)
剖析Linux网络包接收过程:掌握数据如何被捕获和分发的全过程
|
存储 网络协议 Linux
剖析Linux网络包接收过程:掌握数据如何被捕获和分发的全过程(下)
剖析Linux网络包接收过程:掌握数据如何被捕获和分发的全过程
|
前端开发 JavaScript Java
Springboot 整合 Socket 实战案例 ,实现 单点发送、广播群发,1对1,1对多
Springboot 整合 Socket 实战案例 ,实现 单点发送、广播群发,1对1,1对多
1547 0
Springboot 整合 Socket 实战案例 ,实现 单点发送、广播群发,1对1,1对多
|
定位技术 开发工具 Windows
如何在RTSP/RTMP直播过程中加入SEI扩展数据发送和接收解析
在直播系统中,除了直播音视频之外,有时候还想从主播端发布文本信息等,这些信息可以不通过视频传输通道发送给用户播放端,但如果传输的数据想和视频保持精准同步,那最好的办法就是这些信息和视频数据打包在一起传输,并通过h264 sei方式就可以把数据放入h264 Access Unit中传输。
301 0
|
存储 网络协议 数据处理
协议栈——收发数据(拼接网络包,自动重发,滑动窗口机制)
协议栈——收发数据(拼接网络包,自动重发,滑动窗口机制)
388 1
|
消息中间件 物联网 调度
OSAL 消息收发过程 | 学习笔记
快速学习 OSAL 消息收发过程
OSAL 消息收发过程 | 学习笔记
|
NoSQL Redis 开发者
数据类型-案例:微信接收消息顺序控制| 学习笔记
快速学习数据类型-案例:微信接收消息顺序控制
数据类型-案例:微信接收消息顺序控制| 学习笔记
|
JSON 网络协议 测试技术
海量用户通讯系统-服务器接收消息2|学习笔记
快速学习海量用户通讯系统-服务器接收消息2
海量用户通讯系统-服务器接收消息2|学习笔记