组播例子

一个例子一个例子 一个例子一个例子一个例子一个例子一个例子一个例子一个例子一个例子 立即下载

编译程序用下列命令:
gcc -Wall mcastclient.c -o mcastclient
gcc -Wall mcastserver.c -o mcastserver
运行程序用如下命令:
./mcastserver 230.1.1.1 7838
客户端程序运行命令为:
./mcastclient 230.1.1.1 7838 192.168.100.1 12345
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <errno.h>
#define BUFLEN 255
/*********************************************************************
*filename: mcastserver.c
*purpose: 演示组播编程的基本步骤,组播服务器端,关键在于加入组
*tidied by: zhoulifa( zhoulifa@163.com) 周立发( http://zhoulifa.bokee.com)
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
*date time:2007-01-25 13:20:00
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循GPL
*Thanks to: Google.com
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
*********************************************************************/
int main(int argc, char **argv)
{
    struct sockaddr_in peeraddr;
    struct in_addr ia;
    int sockfd;
    char recmsg[BUFLEN + 1];
    unsigned int socklen, n;
    struct hostent *group;
    struct ip_mreq mreq;
   
    /* 创建 socket 用于UDP通讯 */
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
     {
        printf("socket creating err in udptalk\n");
        exit(1);
      }
    /* 设置要加入组播的地址 */
     bzero(&mreq, sizeof(struct ip_mreq));
     if (argv[1])
      {
         if ((group = gethostbyname(argv[1])) == (struct hostent *) 0)
          {
            perror("gethostbyname");
            exit(errno);
          }
      }
     else
      {
         printf("you should give me a group address, 224.0.0.0-239.255.255.255\n");
         exit(errno);
      }
      bcopy((void *) group->h_addr, (void *) &ia, group->h_length);
      /* 设置组地址 */
      bcopy(&ia, &mreq.imr_multiaddr.s_addr, sizeof(struct in_addr));
       /* 设置发送组播消息的源主机的地址信息 */
      mreq.imr_interface.s_addr = htonl(INADDR_ANY);
       /* 把本机加入组播地址,即本机网卡作为组播成员,只有加入组才能收到组播消息 */
     if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,sizeof(struct ip_mreq)) == -1)
      {
        perror("setsockopt");
        exit(-1);
       }
     socklen = sizeof(struct sockaddr_in);
     memset(&peeraddr, 0, socklen);
     peeraddr.sin_family = AF_INET;
     if (argv[2])
        peeraddr.sin_port = htons(atoi(argv[2]));
     else
        peeraddr.sin_port = htons(7838);
     if (argv[1])
      {
         if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0)
          {
              printf("Wrong dest IP address!\n");
              exit(0);
          }
       }
      else
       {
          printf("no group address given, 224.0.0.0-239.255.255.255\n");
           exit(errno);
        }
/* 绑定自己的端口和IP信息到socket上 */
    if (bind(sockfd, (struct sockaddr *) &peeraddr,sizeof(struct sockaddr_in)) == -1)
     {
        printf("Bind error\n");
        exit(0);
      }
     
int len = 0;
      len = sizeof(struct sockaddr_in);
      printf("%s\n", inet_ntoa(peeraddr.sin_addr));
     printf("port:%d\n", peeraddr.sin_port); 
    
/* 循环接收网络上来的组播消息 */
for (;;)
{
    bzero(recmsg, BUFLEN + 1);
    n = recvfrom(sockfd, recmsg, BUFLEN, 0,(struct sockaddr *) &peeraddr, &socklen);
    if (n < 0)
    {
      printf("recvfrom err in udptalk!\n");
      exit(4);
    }
    else
    {
      /* 成功接收到数据报 */
      //int len = 0;
      len = sizeof(struct sockaddr_in);
      printf("%s\n", inet_ntoa(peeraddr.sin_addr));
     printf("port:%d\n", peeraddr.sin_port); 
     
      recmsg[n] = 0;
      printf("peer:%s", recmsg);
    }
}
}
 
 
 
 
 
///////////////////////////////client/////////////////////////////////
 
 
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFLEN 255
/*********************************************************************
*filename: mcastclient.c
*purpose: 演示组播编程的基本步骤,其实这就是一个基本的UDP客户端程序
*tidied by: zhoulifa( zhoulifa@163.com) 周立发( http://zhoulifa.bokee.com)
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
*date time:2007-01-25 13:10:00
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途
* 但请遵循GPL
*Thanks to: Google.com
*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力
* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!
*********************************************************************/
int main(int argc, char **argv)
{
    struct sockaddr_in peeraddr, myaddr;
    int sockfd;
    char recmsg[BUFLEN + 1];
    unsigned int socklen;
   
    /* 创建 socket 用于UDP通讯 */
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
     {
         printf("socket creating error\n");
         exit(1);
      }
    socklen = sizeof(struct sockaddr_in);
   
    /* 设置对方的端口和IP信息 */
    memset(&peeraddr, 0, socklen);
    peeraddr.sin_family = AF_INET;
    if (argv[2])
     {
         peeraddr.sin_port = htons(atoi(argv[2]));
      }
    else
     {
        peeraddr.sin_port = htons(7838);
      }
    if (argv[1])
     {
        /* 注意这里设置的对方地址是指组播地址,而不是对方的实际IP地址 */
        if (inet_pton(AF_INET, argv[1], &peeraddr.sin_addr) <= 0)
         {
            printf("wrong group address!\n");
            exit(0);
          }
      }
    else
     {
         printf("no group address!\n");
         exit(0);
      }
   
    /* 设置自己的端口和IP信息 */
    memset(&myaddr, 0, socklen);
    myaddr.sin_family = AF_INET;
    if (argv[4])
      myaddr.sin_port = htons(atoi(argv[4]));
    else
      myaddr.sin_port = htons(23456);
   
    /*
    if (argv[3])
     {
        if (inet_pton(AF_INET, argv[3], &myaddr.sin_addr) <= 0)
         {
            printf("self ip address error!\n");
            exit(0);
          }
    }
    else
      myaddr.sin_addr.s_addr = INADDR_ANY;
    */
    myaddr.sin_addr.s_addr = INADDR_ANY;
    printf("port:%d\n", myaddr.sin_port);
    /* 绑定自己的端口和IP信息到socket上 */
    if (bind(sockfd, (struct sockaddr *) &myaddr,  sizeof(struct sockaddr_in)) == -1)
     {
        printf("Bind error\n");
        perror("bind");
        exit(0);
      }
     
    int len = 0;
         len = sizeof(struct sockaddr_in);
         getsockname(sockfd, (struct sockaddr *)&myaddr, &len);
         printf("%s\n", inet_ntoa(myaddr.sin_addr));
     printf("port:%d\n", myaddr.sin_port);   
   
    /* 循环接受用户输入的消息发送组播消息 */
    for (;;)
    {
        /* 接受用户输入 */
        bzero(recmsg, BUFLEN + 1);
        if (fgets(recmsg, BUFLEN, stdin) == (char *) EOF)
          exit(0);
        /* 发送消息 */
        if (sendto(sockfd, recmsg, strlen(recmsg), 0,(struct sockaddr *) &peeraddr,sizeof(struct sockaddr_in)) < 0)
         {
            printf("sendto error!\n");
            exit(3);
          }
       
       
         
        printf("'%s' send ok\n", recmsg);
    }

例子源码-MultiCastTest 这是一个用vc写的实现例子,希望对想了解技术的人有帮助。 立即下载

相关推荐

华为s9300网络配置案例

主要讲述基于VLAN的静态二层示例,基于华为s9300核心交换机。

简单的例子

SOCK_STREAM套接口(流套接口)的性质 1、不保留任何消息的边界       举一个例子:本地主机通过两次独立的write(2)调用向远程主机发送数据,第一次本地进程写入25字节的数据,并通过套接口发送到远程进程,第二次再写入30字节的数据发往远程进程,总共55字节的数据,而远程进程从套接口接收数据时,将消息作为一个完整的单元来接收,或是通过若干次独立的读操作来将数据取走,即接

oldmtn的专栏 3426

UDP /多示例程序

UDP /多示例程序,实现数据多发送客户端功能。

详解及示例代码

详解及示例代码

weixin_46935110的博客 6862

IGMP-原理介绍+报文分析+配置示例

IGMP最全介绍

fengxingzhe008的博客 3万+

IP及实例

二、网络的体系结构 网络体系结构包括:的基本工作原理、实现的条件、的地址分配方案及与MAC地址映射、Internet管理协议。 2.1的工作原理 是一种允许一个或多个发送者(源)发送单一的数据包到多个接收者(一次的,同时的)的网络技术。源把数据包发送到特定,而只有属于该 的地址才能接收到数据包。可以大大的节省网络带宽,因为无论有多

The Coding World 2570

Qt系列文章018-UDP

1 前言     上文因为篇幅和特性的问题,我只写了单和广的实例程序,所以这篇主打UDP的程序实现和相关讲解。 2 的特性    在上一篇文章中,给出了示意图,简单表示了的原理。UDP是主机之间 一对一 的通信模式,当多个客户端加入由一个地址定义的多之后,客户端向地址和端口发送的UDP数据报,内成员都可以接收到,其功能类似于QQ群。    报文的目的地址使用D类IP地址,D类地址不能出现在IP报文的源IP地址字段。用同一个IP多地址接收多数据报的所有主机构

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 1873

IP的简单例子

发送端代码,基本步骤: 1,创建一个udpsocket sock = socket(PF_INET, SOCK_DGRAM, 0); 2,绑定到一个发送数据的网卡,或者绑定到ADDR_ANY,  saddr.sin_family = AF_INET; saddr.sin_port = htons(0); // 发送端任意使用个端口,因为要调用bind,所以用0,

开心乐源的专栏 2062

发送和接收的源代码例子【转】

原理这里就不介绍了, 我博客里有介绍原理的详细的文章。 这里只是实现一个小例子, 一个 send.cpp 一个recv.cpp文件。 编译后生成2个进程, 一个接收一个发送。 Sender.cpp 文件内容如下: #include #include #include #include #include #include #include #includ

fei的专栏 2722

c#简单的例子

c#简单的例子 根据internet NIC关于IP地址的规定,IP地址共分为A-E 共5类,其中A-C类目前应用的普通IP地址,E类地址保留为将来使用,D 类地址即为地址,其网络号为固定的1110(第0~3位),第4~31位定义了某一特殊的地址,...

aiwend9976的博客 268

IP技术介绍及实现例子

原文链接:https://blog.csdn.net/langeldep/article/details/6167137 引 言 近年来,随着Internet的迅速普及和爆炸性发展,在Internet上产生了许多新的应用,其中不少是高带宽的多媒体应用,譬如网 络视频会议、网络音频/视频广、AOD/V...

gyqinag的专栏 815

发送和接收的源代码例子

原理这里就不介绍了, 我博客里有介绍原理的详细的文章。   这里只是实现一个小例子, 一个 send.cpp 一个recv.cpp文件。   编译后生成2个进程, 一个接收一个发送。   Sender.cpp 文件内容如下:   #include #include #include #include #include #include #include #in

Langeldep的专栏 2万+

udp c语言实现例子

用于将数据包发送到一特定的接收者,只有加入该地址的设备才能接收数据。:这是IPv6的地址范围,类似于IPv4中的D类地址。IPv6的地址有多种用途,包括用于特定服务和协议的发现。所有接收设备都会接收广消息,因此广的范围更广,但会增加网络负担。:这个范围被称为“本地网络地址”,主要用于局域网内部的通信。:这个范围通常被称为“临时地址”,可以被用户和开发者自由使用。简单来说,是“对特定发送”,而广是“对所有发送”是一个特殊的广地址,表示发送给同一网络中的所有设备。

AppNinja 开发手记 1079

C#简单例子

转自http://www.cnblogs.com/yansheng/archive/2011/11/15/2249287.html,如有侵权联系删除 使用有一个很大的好处,消息往只管往里面丢,接受端开个线程,不断地接收就可以了。 发送端: Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, Proto

yuhai738639的博客 1445

windows例子

接收端: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #include <ws2tcpip.h> void sockerr(const char* message) { wchar_t* s = NULL; FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORM

choujayyl的专栏 712
上一篇: 一个简单的Linux下组播通信的例子
下一篇: yuv数据分析
杨柳
博客等级 码龄17年 230粉丝 158原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值