组播编程

原创 2015年07月09日 13:50:23

组播编程(含一个端口加入多个组播)

1**. 组播客户端**

.h文件

#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"//修改自己的ip
    typedef int socklen_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文件


#include "struct.h"

//int datalen;

struct sockaddr_in localSock;
struct ip_mreq group1, group2;


int GetSOCK_DGRAM(unsigned short port)
{
    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");

    {
       //此处代码用于端口复用
        int reuse = 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"); 
    }


    int ret = 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, (struct sockaddr*)&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);//相当于组名
    group1.imr_interface.s_addr = inet_addr(LOCAL_IP);//自己的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);//相当于组名
    group2.imr_interface.s_addr = inet_addr(LOCAL_IP);//自己的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;

    return sd;
}

int InitSocket()
{   
#ifdef WIN32
    int Error;
    WORD VersionRequested;
    WSADATA WsaData;
    VersionRequested=MAKEWORD(2,2);
    Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
    if(Error!=0)
    {
        return 0;
    }
    else
    {
        if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
        {
            WSACleanup();
            return 0;
        }       
    }
#endif


    return 0;
}

int main(int argc, char *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));
    struct sockaddr_in from;
    int fromlen = sizeof(from); 
    int nRecvLen = 1;
    const int FILE_LEN = 1024*10;
    //char* bufWrite = new char[FILE_LEN];
    const int recvSize = 1024*1000;
    unsigned char* databuf = new unsigned char[recvSize];

    while(1)//nRecvLen > 0
    {
        nRecvLen = recvfrom(sd, (char*)databuf, recvSize, 0, (struct sockaddr*)&from, (socklen_t*)&fromlen) ;//read
        if (nRecvLen > 0)
        {           
        //  continue;
        }

        printf("sendIp = %s,recvBuf=%s\n", inet_ntoa(from.sin_addr), databuf);

    }

    return 0;
}

  1. 组播服务端
    .cpp文件
#include "../struct.h"



int InitSocket()
{   
#ifdef WIN32
    int Error;
    WORD VersionRequested;
    WSADATA WsaData;
    VersionRequested=MAKEWORD(2,2);
    Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
    if(Error!=0)
    {
        return 0;
    }
    else
    {
        if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
        {
            WSACleanup();
            return 0;
        }       
    }
#endif

    return 0;
}


int main (int argc, char *argv[ ])
{
    InitSocket();

    //设置socket
    struct in_addr localInterface;
    struct sockaddr_in groupSock;
    char bufSend[BUFSIZ];
    int sd = 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 第一个字节不超过239 后面3个字节用来区别分组 不是掩码
    groupSock.sin_port = htons(PORT);
    localInterface.s_addr = inet_addr(LOCAL_IP);//自己的ip,可以和目标不在一个网,但设置不同的网段。

    //设置组播
    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 (int i=0;;i++)
    {       
        //Send(bufSend, sizeof(bufSend));               
        sprintf(bufSend, "%d", i);
        sendto(sd, bufSend, sizeof(bufSend), 0, (struct sockaddr*)&groupSock, sizeof(groupSock));       
        printf("group=%s,locolip=%s,send=%s\n", GROUP_IP1, LOCAL_IP, bufSend);
        Sleep(1000);                         
    }   
    return 0;
}


linux网络编程之二-----多播(组播)编程

多播编程实例服务器端下面是一个多播服务器的例子。多播服务器的程序设计很简单,建立一个数据包套接字,选定多播的IP地址和端口,直接向此多播地址发送数据就可以了。多播服务器的程序设计,不需要服务器加入多播...
  • ctthunagchneg
  • ctthunagchneg
  • 2015年06月20日 01:25
  • 1301

Linux网络编程 之 UDP 组播实例

一个很简单udp 组播通信的例子,分别为服务器端和客户端的代码。 1、服务器端代码 (multi_udp_server.c) [objc] view plaincopy ...
  • sin0803
  • sin0803
  • 2015年07月09日 11:21
  • 1560

【Linux网络编程】多播、组播

概述 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际情况下,经常需要对一组...
  • dengjin20104042056
  • dengjin20104042056
  • 2016年08月29日 22:29
  • 1355

组播(多播)的C程序实战

每个人都有不同的认知规律和习惯, 有的人喜欢搞一套严密的大理论, 论述起来滔滔不绝, 不管自己懂不懂, 反正读者/听者是没搞懂。 有的人喜欢从实践出发, 没看到代码, 不运行一下, 不看到结果, 就不...
  • stpeace
  • stpeace
  • 2015年05月21日 23:25
  • 6384

UDP 组播 实例

http://blog.csdn.net/yanyuanfen2011/article/details/16888801 最近一直在做linux的网络,现在作个总结,陆续贴出来。 在网上搜...
  • cjsycyl
  • cjsycyl
  • 2014年02月22日 10:49
  • 16880

linux网络编程:多播(组播)编程

什么是多播        单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。实际...
  • li_wen01
  • li_wen01
  • 2017年04月11日 10:32
  • 561

Linux网络编程 之 UDP 组播

最近一直在做linux的网络,现在作个总结,陆续贴出来。 在网上搜了很多资料 ,其中周立发的博客对我的学习参考作用最大,谢谢前辈。 直接上代码吧,一个很简单udp 组播通信的例子,分别为服务器端和...
  • yanyuanfen2011
  • yanyuanfen2011
  • 2013年11月22日 17:59
  • 4131

windows网络编程之组播

setsockopt (s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger)); ///////////////////////...
  • u011164819
  • u011164819
  • 2016年10月31日 09:28
  • 1390

linux网络编程之一-----多播(组播)编程

什么是多播        组播(Multicast)是网络一种点对多(one to many)的通信方式,通过报文复制完成网络中一台server对应多台接收者的高效数据传 送。对其形象的比喻就是类似于...
  • ctthunagchneg
  • ctthunagchneg
  • 2015年06月20日 00:33
  • 2387

socket之组播

socket之组播 一、什么是组播 1、组播的特点 1)什么是组播? 组播是一种数据包传输方式,当有多台主机同时成为一个数据包的接受者时,出于对带宽和CPU负担的考虑,组播成为了一种最佳选...
  • LACZF
  • LACZF
  • 2015年08月17日 21:05
  • 2181
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:组播编程
举报原因:
原因补充:

(最多只允许输入30个字)