Multicast programming (with one port joining multiple multicast)
1**. Multicast Client * *
. h file
#pragma once#include <stdio.h>#include <stdlib.h>#include <string.h>//#include <ZYF_SRC/osal/OSAL.cpp>#ifdef WIN32 #include <winsock.h>//ip_mreq //#include <winsock2. H> #pragma comment (lib, "Wsock32.lib")//ws2_32.lib #define CLOSE Closesocket #define LOCAL_IP "192.168.0.235"//Modify your own IP typedef intsocklen_t;#else #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <unistd.h>//close () #endif#define GROUP_IP1 "239.255.0.2"//224.0.0.0-239.255.255.255 #define GROUP_IP2 "239.255.0.3"//224.0.0.0-239.255.255.255 #define PORT 8058
. cpp Files
#include "struct.h"//int Datalen;structSockaddr_in Localsock;structIp_mreq group1, group2;intGetsock_dgram (unsigned ShortPort) {Socket SD = socket (af_inet, SOCK_DGRAM,0);if(SD <0) {perror ("Opening Datagram socket Error");Exit(1); }Else printf("Opening datagram socket .... ok.\n "); {//code here for Port Multiplexing intReuse =1;if(setsockopt (SD, Sol_socket, SO_REUSEADDR, (Char*) &reuse,sizeof(reuse)) <0) {perror ("Setting so_reuseaddr Error"); Close (SD);Exit(1); }Else printf("Setting so_reuseaddr ... ok.\n "); }intRET =0;memset((Char*) &localsock,0,sizeof(Localsock)); localsock.sin_family = af_inet; Localsock.sin_port = port; LOCALSOCK.SIN_ADDR.S_ADDR = Inaddr_any;if(Bind (SD, (structsockaddr*) &localsock,sizeof(Localsock))) {Perror ("Binding Datagram socket Error"); Close (SD);Exit(1); }Else{printf("Binding Datagram socket ... ok.\n "); } group1.imr_multiaddr.s_addr = inet_addr (GROUP_IP1);//equivalent to group nameGROUP1.IMR_INTERFACE.S_ADDR = inet_addr (LOCAL_IP);//Own IP if(setsockopt (SD, IPPROTO_IP, Ip_add_membership, (Char*) &group1,sizeof(group1)) <0) {perror ("Adding Multicast group1 error"); Close (SD);Exit(1); }Else printf("Adding Multicast group1 ... ok.\n "); GROUP2.IMR_MULTIADDR.S_ADDR = inet_addr (GROUP_IP2);//equivalent to group nameGROUP2.IMR_INTERFACE.S_ADDR = inet_addr (LOCAL_IP);//Own IP if(setsockopt (SD, IPPROTO_IP, Ip_add_membership, (Char*) &group2,sizeof(group2)) <0) {perror ("Adding Multicast group2 Error"); Close (SD);Exit(1); }Else printf("Adding Multicast group2 ... ok.\n ");//datalen = recvsize; returnSD;}intInitsocket () {#ifdef WIN32 intError; WORD versionrequested; Wsadata Wsadata; Versionrequested=makeword (2,2); Error=wsastartup (Versionrequested,&wsadata);//Start WinSock2 if(error!=0) {return 0; }Else{if(Lobyte (wsadata.wversion)! =2|| Hibyte (wsadata.whighversion)! =2) {WSACleanup ();return 0; } }#endif return 0;}intMainintargcChar*argv[]) {printf("Udeclientstart (). group1=%s,group2=%s,port=%d,locol=%s,build=%s\n", GROUP_IP1,GROUP_IP2, PORT, Local_ip, __time__); Initsocket (); SOCKET sd = Getsock_dgram (htons (PORT));structSockaddr_in from;intFromlen =sizeof(from);intNrecvlen =1;Const intFile_len =1024x768*Ten;//char* bufwrite = new Char[file_len]; Const intRecvsize =1024x768* +;unsigned Char* Databuf =New unsigned Char[Recvsize]; while(1)//nrecvlen > 0{Nrecvlen = recvfrom (SD, (Char*) Databuf, recvsize,0, (structsockaddr*) &from, (socklen_t*) &fromlen);//read if(Nrecvlen >0) {//Continue;}printf("Sendip =%s,recvbuf=%s\n", Inet_ntoa (FROM.SIN_ADDR), databuf); }return 0;}
- Multicast Service side
. cpp Files
#include ". /struct.h "intInitsocket () {#ifdef WIN32 intError; WORD versionrequested; Wsadata Wsadata; Versionrequested=makeword (2,2); Error=wsastartup (Versionrequested,&wsadata);//Start WinSock2 if(error!=0) {return 0; }Else{if(Lobyte (wsadata.wversion)! =2|| Hibyte (wsadata.whighversion)! =2) {WSACleanup ();return 0; } }#endif return 0;}intMain (intargcChar*argv[]) {initsocket ();//Set socket structIN_ADDR Localinterface;structSockaddr_in Groupsock;CharBufsend[bufsiz];intSD = socket (af_inet, SOCK_DGRAM,0);if(SD <0) {perror ("Opening Datagram socket Error");Exit(1); }memset((Char*) &groupsock,0,sizeof(Groupsock)); groupsock.sin_family = af_inet; GROUPSOCK.SIN_ADDR.S_ADDR = inet_addr (GROUP_IP1);//group_ip The first byte does not exceed 239 followed by 3 bytes to distinguish the grouping is not a maskGroupsock.sin_port = htons (port); LOCALINTERFACE.S_ADDR = inet_addr (LOCAL_IP);//own IP, can and target not a network, but set different network segments. //Set up multicast if(setsockopt (SD, IPPROTO_IP, Ip_multicast_if, (Char*) &localinterface,sizeof(Localinterface)) <0) {perror ("Setting Local interface Error");Exit(1); }Else{printf("Setting The Local interface ... ok\n "); } for(intI=0;; i++) {//send (bufsend, sizeof (bufsend)); sprintf(Bufsend,"%d", i); SendTo (SD, Bufsend,sizeof(Bufsend),0, (structsockaddr*) &groupsock,sizeof(Groupsock));printf("group=%s,locolip=%s,send=%s\n", Group_ip1, Local_ip, bufsend); Sleep ( +); }return 0;}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
Welcome to the Csdn-markdown Editor