一个简单的局域网多播示例

该博客提供了一个C++编写的简单局域网多播示例代码。代码中进行了socket初始化,创建UDP套接口,设置多播相关参数,如TTL、回馈等,还创建了发送和接收线程,实现读取用户输入并发送到多播组,以及读取多播组数据的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
/*
*描述:一个简单的局域网多播示例(MultiCast In LAN. C++ Sample Codes)
*作者:魏孙鼎
*Email:weisunding@gmail.com
*2005年6月21日,广州
*/

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") 

using namespace std; 

//---------------------------------------------------------------
#define MULTICAST_IP    "225.6.7.8" //多播组地址 224.0.0.0 - 239.255.255.255
#define MULTICAST_PORT  2100  //多播组端口 
#define BUFFER_SIZE     1024 
//---------------------------------------------------------------


void SendProc(void* arg); 
void RecvProc(void* arg);

//------------------------------------------------
//程序入口,为了程序简单清晰,省略SOCKET_ERROR的判断
//------------------------------------------------
int main() 
{ 
 //socket 初始化
 WSAData wsaData; 
 if( WSAStartup(MAKEWORD(2,0), &wsaData) != 0 ) {
  cout<<"Error in WSAStartup"<<endl; 
  return 0; 
 }

 SOCKET server; 
 server = socket(AF_INET, SOCK_DGRAM, 0); //创建一个UDP套接口 

 int ret;

 //允许程序的多个实例运行在同一台机器上 
 const int on = 1; 
 ret = setsockopt(server, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)); 

 //设置TTL - Time To Live
 const int routenum = 10; 
 ret = setsockopt(server,IPPROTO_IP,IP_MULTICAST_TTL,(char*)&routenum,sizeof(routenum)); 

 //设置回馈,1表示可回馈到本机
 const int loopback = 1; 
 ret = setsockopt(server,IPPROTO_IP,IP_MULTICAST_LOOP,(char*)&loopback,sizeof(loopback)); 
  
 //设置本地地址,端口与多播端口一致
 sockaddr_in local;  
 local.sin_family = AF_INET; 
 local.sin_port   = htons(MULTICAST_PORT); 
 local.sin_addr.S_un.S_addr = INADDR_ANY; 

 //绑定到本地端口
 ret = bind(server, (sockaddr*)(&local), sizeof(local)); 
 
 //设置多播组结构
 ip_mreq mreq;  
 mreq.imr_interface.S_un.S_addr = INADDR_ANY;     //本地地址
 mreq.imr_multiaddr.S_un.S_addr = inet_addr(MULTICAST_IP); //多播地址

 //加入一个多播组
 ret = setsockopt(server,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&mreq,sizeof(mreq)); 


 //创建发送线程
 HANDLE hSend = CreateThread(NULL,
        NULL,
        (LPTHREAD_START_ROUTINE)SendProc,
        (void *)server,
        NULL,
        NULL);


 //创建读多播组数据线程
 HANDLE hRead = CreateThread(NULL,
        NULL,
        (LPTHREAD_START_ROUTINE)RecvProc,
        (void *)server,
        NULL,
        NULL);

 

 //如果用户输入结束,程序就终止了 
 WaitForSingleObject(hSend, INFINITE); 
 WSACleanup(); 

 return 0; 
} 


//-----------------------------------
//读取用户输入并发送到多播组线程函数 
//-----------------------------------
void SendProc(void* arg) 
{ 
 SOCKET server = (SOCKET)arg; 
 char sendline[BUFFER_SIZE+1]; 

 //设置多播地址
 sockaddr_in remote;  
 remote.sin_addr.s_addr = inet_addr ( MULTICAST_IP ); 
 remote.sin_family = AF_INET ; 
 remote.sin_port   = htons(MULTICAST_PORT); 

 cout<<"发送线程已启动,请输入(输入end结束)..."<<endl;

 //读取用户输入直到用户输入"end" 
 for(;;) 
 {   
  cin.getline(sendline, BUFFER_SIZE); 
  
  if(strncmp(sendline,"end",3)==0) 
   break; 

  //发送用户输入的数据到多播组 
  sendto(server, sendline, strlen(sendline), 0, (sockaddr*)(&remote), sizeof(remote)); 
 } 

 cout<<"发送线程结束..."<<endl;
} 


//----------------------------------
//读取多播组数据函数
//----------------------------------
void RecvProc(void* arg) 
{ 
 SOCKET server = (SOCKET)arg; 

 char buf[BUFFER_SIZE+1] = "/0"; 
 int ret; 

 sockaddr_in client; 
 int clientLen; 

 //一直读取直到主线程终止 
 for(;;)
 { 
  clientLen = sizeof(client); 
  memset(buf,0, sizeof(buf));

  ret = recvfrom(server, buf, BUFFER_SIZE, 0, (sockaddr*)(&clientLen), &clientLen); 
  
  if (ret == 0) 
   continue;

  if (ret > 0)
  {
   cout<<"=============================================="<<endl;
   cout<<"接收到"<<ret<<"字节:"<<endl;
   cout<<buf<<endl;
   cout<<"----------------------------------------------"<<endl;
  }
 } 

 cout<<"接收线程结束 ..."<<endl;

 
近来有许多大富翁朋友提出“如何在局域网多播稳定传送大文件”的问题,为此我做了这个小程序供大家参考。我的思路:传送文件有很多方法,我看到的大富翁上的朋友说过,用udp的方式不能稳定传送大文件,故我决定采用TCPIP方式。同时考虑到速度,我提供了多线程创送的方式。程序包中有两个文件夹:1)接收程序;2)发送程序以下操作说明是针对单机操作的:1)将任意一个文件命名为“测试例子.rar”,然后放在发送程序目录下;或者启动发送程序后再选择2)启动接收程序目录下的Server.exe程序3)启动发送程序目录下的MultiThreadDemo.exe程序4)在MultiThreadDemo.exe程序中,从“Synchronization Method”GroupBox中选择一种同步方法 注意!!!!在单机操作时,只能选择Mutex方式5)在MultiThreadDemo.exe程序中,点击“创建同步对象”Button6)在MultiThreadDemo.exe程序中,点击“传送文件”Button7)传送完毕后,到接收程序目录下查看是否收到“测试例子.rar”针对局域网的操作,我没有做测试,以下是几点说明:1)自行修改“传送文件”Button的OnClick事件2)注意往不同的机子传送时,要为线程中的私有变量设置相应的IP地址和端口,同时将Server.exe拷贝到这台机子上3)可以进行异步创送,即No Synchronization和Semaphore方式读者如果想使用该例子,建立进一步完善传送过程中的容错处理。这是个demo程序,难免会有许多bug,希望读者原谅,同时把发现的问题和更好的思路发email给我。 黄晓斌 hxb_leiyuan2000@163.net
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值