/* *描述:一个简单的局域网多播示例(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;
一个简单的局域网多播示例
最新推荐文章于 2022-12-17 01:17:02 发布