免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6435 | 回复: 6
打印 上一主题 下一主题

主机通过wifi上网无法收到虚拟机的广播或多播消息? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-11 23:36 |只看该作者 |倒序浏览
本帖最后由 e3399 于 2012-05-14 21:53 编辑

我的主机是win7,通过WIFI上网,用的是vmware8,网络模式设成了桥接模式。在虚拟机linux系统里写了一个简单的UDP广播或多播程序,但主机收不到该广播消息,
若我换成有线上网,则主机能收到广播或多播消息。
不知道原因是什么?
  1. /**********************************************************************
  2. * Compiler: GCC
  3. * Last Update:  Mon 14 May 2012 08:40:24 PM CST
  4. * File Name: myServerMulticast2.c
  5. * Description: 多播客户端
  6. * Usage: myServerMulticast2 多播地址 [端口号(默认为PORT)]
  7. ************************************************************************/
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <errno.h>
  11. #include <string.h>
  12. #include <netinet/in.h>
  13. #include <sys/types.h>
  14. #include <sys/socket.h>
  15. #define MAXBUF 1024
  16. #define PORT 60000

  17. int main(int argc, char **argv)
  18. {
  19.     int myFd;
  20.     struct sockaddr_in mCastAddr;
  21.     int addrlen = sizeof(mCastAddr);
  22.     char buf[MAXBUF];

  23.     bzero(&mCastAddr, sizeof(mCastAddr));
  24.     bzero(buf, sizeof(buf));
  25.     //创建套接字
  26.     if((myFd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
  27.         printf("socket()错误码:%d, %s\n", errno, strerror(errno));
  28.         exit(errno);
  29.     }

  30.     mCastAddr.sin_family  = AF_INET;
  31.     if (argc > 1) {  //IP地址
  32.         int res;
  33.         if ((res = inet_pton(AF_INET, argv[1], &mCastAddr.sin_addr)) == -1) {
  34.             printf("inet_pton()错误码:%d, %s\n", errno, strerror(errno));
  35.             exit(errno);
  36.         } else if(res == 0) {
  37.             printf("IP地址无效\n");
  38.             printf("请输入一个多播地址:224.0.0.1 ~ 239.255.255.255\n");
  39.             return 0;
  40.         }
  41.     } else {
  42.         printf("Usage: %s 多播IP地址\n", argv[0]);
  43.         return 0;
  44.     }
  45.    
  46.     if (argc == 3) {
  47.         mCastAddr.sin_port = htons(atoi(argv[2]));
  48.     } else {
  49.         mCastAddr.sin_port = htons(PORT);
  50.     }
  51.    
  52.     while (1) {
  53.         bzero(buf, sizeof(buf));
  54.         printf("请输入要发送的消息:");
  55.         if (fgets(buf, sizeof(buf), stdin) == NULL) {
  56.             exit(0);
  57.         }
  58.         if (sendto(myFd, buf, strlen(buf) + 1, 0,
  59.                     (struct sockaddr *)&mCastAddr, sizeof(mCastAddr)) == -1) {
  60.             printf("sendto()错误码:%d, %s\n", errno, strerror(errno));
  61.             exit(errno);
  62.         }
  63.         printf("成功给对方发送消息:%s", buf);
  64.     }

  65.     return 0;
  66. }
复制代码
  1. /**********************************************************************
  2. * Compiler: GCC
  3. * Last Update:  Mon 14 May 2012 06:48:56 PM CST
  4. * File Name: myClientMulticast2.c
  5. * Description:
  6. ************************************************************************/
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <errno.h>
  10. #include <string.h>
  11. #include <netinet/in.h>
  12. #include <sys/types.h>
  13. #include <sys/socket.h>
  14. #define _DEBUG
  15. #define MAXBUF 1024
  16. #define PORT 60000

  17. int main(int argc, char **argv)
  18. {
  19.     int myFd, clientFd;
  20.     struct sockaddr_in myAddr, clientAddr;
  21.     struct ip_mreq mreq;
  22.     int addrlen = sizeof(clientAddr);
  23.     char buf[MAXBUF];
  24.     char addrTemp[INET_ADDRSTRLEN];

  25.     bzero(&myAddr, sizeof(myAddr));
  26.     bzero(&clientAddr, sizeof(clientAddr));
  27.     //创建套接字,datagrams
  28.     if((myFd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
  29.         printf("%s Line number:%d socket()错误码:%d, %s\n", \
  30.                 __FILE__, __LINE__, errno, strerror(errno));
  31.         exit(errno);
  32.     }
  33.    
  34.     //设置本地地址端口信息
  35.     myAddr.sin_family  = AF_INET;
  36.     myAddr.sin_addr.s_addr = INADDR_ANY;
  37.     if (argc == 3) {
  38.         myAddr.sin_port = htons(atoi(argv[2]));
  39.     } else {
  40.         myAddr.sin_port = htons(PORT);
  41.     }

  42.     //绑定本地套接字
  43.     if(bind(myFd, (struct sockaddr *)&myAddr, sizeof(myAddr)) != 0) {
  44.         printf("%s Line number:%d bind()错误码:%d, %s\n", \
  45.                 __FILE__, __LINE__, errno, strerror(errno));
  46.         exit(errno);
  47.     }

  48.     //设置IP_MULTICAST_LOOP
  49.     u_char loop = 1;
  50.     if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) != 0) {
  51.         printf("%s Line number:%d setsockopt()错误码:%d, %s\n", \
  52.                 __FILE__, __LINE__, errno, strerror(errno));
  53.         exit(errno);
  54.     }

  55.     //设置IP_MULTICAST_TTL 为1,即该多播最多只能经过一个路由器
  56.     u_char ttl;
  57.     if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) != 0) {
  58.         printf("%s Line number:%d setsockopt()错误码:%d, %s\n", \
  59.                 __FILE__, __LINE__, errno, strerror(errno));
  60.         exit(errno);
  61.     }

  62.     //对struct ip_mreq这个结构体赋值
  63.     if (argc > 1) {  //设置IP地址
  64.         int res;
  65.         if ((res = inet_pton(AF_INET, argv[1], &mreq.imr_multiaddr)) == -1) {
  66.             printf("%s Line number:%d setsockopt()错误码:%d, %s\n", \
  67.                 __FILE__, __LINE__, errno, strerror(errno));
  68.             exit(errno);
  69.         } else if(res == 0) {
  70.             printf("IP地址无效\n");
  71.             printf("请输入一个多播地址:224.0.0.1 ~ 239.255.255.255\n");
  72.             return 0;
  73.         }
  74.     } else {
  75.         printf("Usage:%s 多播地址(224.0.0.1 ~ 239.255.255.255)\n", argv[0]);
  76.         return(0);
  77.     }
  78.     mreq.imr_interface.s_addr =  INADDR_ANY;
  79.     //将本机加入多播组中
  80.     if (setsockopt (myFd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) {
  81.         printf("%s Line number:%d setsockopt()错误码:%d, %s\n", \
  82.                 __FILE__, __LINE__, errno, strerror(errno));
  83.         exit(errno);
  84.     }

  85.     printf("客户端已启动,等待多播消息.....\n");
  86.     while (1) {
  87.         bzero(buf, sizeof(buf));
  88.         if (recvfrom(myFd, buf, sizeof(buf) - 1, 0,
  89.                     (struct sockaddr *)&clientAddr, &addrlen) == -1) {
  90.             printf("%s Line number:%d recvfrom()错误码:%d, %s\n", \
  91.                     __FILE__, __LINE__, errno, strerror(errno));
  92.             exit(errno);
  93.         }
  94.         printf("收到来自%s的消息:%s",
  95.                 inet_ntop(AF_INET, &clientAddr.sin_addr, addrTemp, sizeof(addrTemp)), buf);
  96.         if (strcmp("exit\n", buf) == 0) {
  97.             break;
  98.         }
  99.     }
  100.     //退出广播组
  101.     if (setsockopt (myFd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) {
  102.         printf("%s Line number:%d setsockopt()错误码:%d, %s\n", \
  103.                 __FILE__, __LINE__, errno, strerror(errno));
  104.         exit(errno);
  105.     }

  106.     return 0;
  107. }


复制代码

论坛徽章:
1
白羊座
日期:2013-09-18 22:02:26
2 [报告]
发表于 2012-05-12 12:52 |只看该作者
广播数据是不能跨越子网的,你的真实机器和虚拟机器不在同一个网段,当然收不到了。

论坛徽章:
0
3 [报告]
发表于 2012-05-12 13:38 |只看该作者
回复 2# file3


    同个网段啊。我用的是桥接模式。
主机IP地址是192.168.1.102
虚拟机地址是192.168.1.104
子网掩码  . . . . . . . . . . . . : 255.255.255.0

论坛徽章:
0
4 [报告]
发表于 2012-05-12 18:39 |只看该作者
你通过什么方式来求证宿主机到底有没有收到udp广播包的?
wireshark?还是写一个程序监听广播包?

我觉得,先以程序监听广播包是否成功为主,wireshark看不到udp广播包可能还有其它我们不了解的机制在这里。

------------------------------------
欢迎光临我的博客:www.danoking.com [DNK的博客]

论坛徽章:
0
5 [报告]
发表于 2012-05-12 18:41 |只看该作者
回复 4# wolf5729


    写一个程序监听广播包


我换成有线上网主机就收得到,无线上网就收不到。不知道会不会又是vm的bug

论坛徽章:
0
6 [报告]
发表于 2012-05-12 18:48 |只看该作者
回复 5# e3399


   不知道与无线上网的机制有没有关系,建议也顺便看看windows的防火墙。
------------------------------------
欢迎光临我的博客:www.danoking.com [DNK的博客]


论坛徽章:
0
7 [报告]
发表于 2012-05-14 21:49 |只看该作者
回复 6# wolf5729


    无线上网的机制?
不懂。
唉。这个问题困扰我两天了。在测试程序时就得换成有线上网,真麻烦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP