组播例子

编译程序用下列命令:
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);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值