关于双网卡绑定socket接收组播的问题

#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 1000

int   

main (int argc, char **argv) 

 

{  

    struct sockaddr_in peeraddr,ia;  

     

       int sockfd; 

    char recmsg[BUFLEN + 1]; 

     

       unsigned int socklen, n; 

    

       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)); 

     

   

    inet_pton(AF_INET,"226.1.1.1",&ia.sin_addr);//组播地址     

     

    /* 设置组地址 */ 

     

    bcopy (&ia.sin_addr.s_addr, &mreq.imr_multiaddr.s_addr, sizeof (struct in_addr)); 

    

    /* 设置发送和接收源主机的地址信息 */ 

    

   // mreq.imr_interface.s_addr = htonl (INADDR_ANY);  

 

   //这样写是否能绑定到对应的网卡上   

    mreq.imr_interface.s_addr = inet_addr("192.168.2.110"); 

      

 

   

    /* 把本机加入组播地址,即本机网卡作为组播成员,只有加入组才能收到组播消息 */ 

  

    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;

    

    peeraddr.sin_port = htons (9999);//组播端口

    

    inet_pton(AF_INET, "226.1.1.1", &peeraddr.sin_addr); //组播地址  

    

    int opt = 1;    

    // sockfd为需要端口复用的套接字    

   

    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&opt, sizeof(opt));   

 

     

    /* 绑定自己的端口和IP信息到socket上 */ 

    

    if (bind(sockfd, (struct sockaddr *) &peeraddr,sizeof (struct sockaddr_in)) == -1)

    

    {      printf ("Bind error\n");      

        

           exit (0);    

    

     }

   

    

     /* 循环接收网络上来的组播消息 */ 

    

    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

        {      /* 成功接收到数据报 */ 

      

              recmsg[n] = 0;      

           

              fflush(stdout);

             

              printf ("peer:");    

         

        }

     

    

      }

 

 

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值