/*
*描述:一个简单的局域网多播示例(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;
一个简单的局域网多播示例
最新推荐文章于 2025-10-03 16:27:20 发布
该博客提供了一个C++编写的简单局域网多播示例代码。代码中进行了socket初始化,创建UDP套接口,设置多播相关参数,如TTL、回馈等,还创建了发送和接收线程,实现读取用户输入并发送到多播组,以及读取多播组数据的功能。
1279





