虚拟机里面写了一个UDP广播程序,但主机无法收到vmware虚拟机的广播消息。

Mark0904 2012-05-11 11:31:31
我的主机是win7,通过WIFI上网,用的是vmware8,在虚拟机linux系统里写了一个简单的UDP广播程序,但主机收不到该广播消息,而虚拟机里面其他客户机系统都能收到广播消息,局域网里其他同学的电脑也能收到。
若我换成有线上网,则主机能收到广播消息。
不知道原因是什么?
...全文
2059 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
米奈希尔 2012-12-25
  • 打赏
  • 举报
回复
好像找到原因了,应该是安装了p2p终结者的原因,附加安装的驱动阻挡了广播
米奈希尔 2012-10-12
  • 打赏
  • 举报
回复
不知道LZ现在找到原因没有?如果解决了能公布一下吗?
米奈希尔 2012-10-12
  • 打赏
  • 举报
回复
我这几天也遇到LZ的问题,敢问是不是Atheros的无线网卡?!
kinglaosun 2012-05-26
  • 打赏
  • 举报
回复
我的问题解决了,原来我把vmnet1 禁止了。启用vmnet1即可。上网找的原理:
VMware三种网络连接上网设置:

1.bridge :

默认使用vmnet0

将虚拟机的ip设置与主机同网段未使用ip,其余与主机相同:

例如主机ip是10.70.54.31,设置虚拟机ip为10.70.54.22。netmask,broadcast,gateway,dns都与主机相同即可实现虚拟机<--->主机 虚拟机<---->互联网 通信。

2.nat :

默认使用vmnet8

将虚拟机设置成使用dhcp方式上网,windows下选择"自动获取ip",linux下开启dhcp服务即可 主机之家

也可以手动设置:

ip设置与vmnet8同网段,gateway设置成vmnet8的gateway(/etc/VMware/vmnet8/nat/nat.conf)中可以查到vmnet8的gateway,通常是xxx.xxx.xxx.2。

netmask,broadcast设置与vmnet8相同,dns设置与主机相同。

例如 vmnet8 ip:172.16.249.1 gw :172.16.249.2

虚拟机设置: ip :172.16.249.100 gw: 172.16.249.2

3.host-only :

默认使用vmnet1

将虚拟机ip设置与vmnet1同网段,gateway设置成vmnet1的ip,其余设置与vmnet1相同,dns设置与主机相同

例如 vmnet1 ip :172.16.245.1

虚拟机设置: ip :172.16.245.100 gateway :172.16.245.1
kinglaosun 2012-05-26
  • 打赏
  • 举报
回复
而且也是桥接方式
kinglaosun 2012-05-26
  • 打赏
  • 举报
回复
我也遇到类似的情况,但稍有些不同。我的主机是win7,虚拟机vm8,虚拟机里面装的是xp,虚拟机里面发出的广播包主机收不到-----不管是有线还是无线。但是虚拟机发出的广播包能被局域网内其他同学的机器收到。不用虚拟机全部用真实机的话程序工作正常。而且主机上的抓包工具可以抓到虚拟机发出的广播包
Mark0904 2012-05-14
  • 打赏
  • 举报
回复
我的主机是win7,通过WIFI上网,用的是vmware8,在虚拟机linux系统里写了一个简单的UDP广播或多播程序,但主机收不到该广播消息,
若我换成有线上网,则主机能收到广播或多播消息。
不知道原因是什么?
/**********************************************************************
* Compiler: GCC
* Last Update: Mon 14 May 2012 08:40:24 PM CST
* File Name: myServerMulticast2.c
* Description: 多播客户端
* Usage: myServerMulticast2 多播地址 [端口号(默认为PORT)]
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#define MAXBUF 1024
#define PORT 60000

int main(int argc, char **argv)
{
int myFd;
struct sockaddr_in mCastAddr;
int addrlen = sizeof(mCastAddr);
char buf[MAXBUF];

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

mCastAddr.sin_family = AF_INET;
if (argc > 1) { //IP地址
int res;
if ((res = inet_pton(AF_INET, argv[1], &mCastAddr.sin_addr)) == -1) {
printf("inet_pton()错误码:%d, %s\n", errno, strerror(errno));
exit(errno);
} else if(res == 0) {
printf("IP地址无效\n");
printf("请输入一个多播地址:224.0.0.1 ~ 239.255.255.255\n");
return 0;
}
} else {
printf("Usage: %s 多播IP地址\n", argv[0]);
return 0;
}

if (argc == 3) {
mCastAddr.sin_port = htons(atoi(argv[2]));
} else {
mCastAddr.sin_port = htons(PORT);
}

while (1) {
bzero(buf, sizeof(buf));
printf("请输入要发送的消息:");
if (fgets(buf, sizeof(buf), stdin) == NULL) {
exit(0);
}
if (sendto(myFd, buf, strlen(buf) + 1, 0,
(struct sockaddr *)&mCastAddr, sizeof(mCastAddr)) == -1) {
printf("sendto()错误码:%d, %s\n", errno, strerror(errno));
exit(errno);
}
printf("成功给对方发送消息:%s", buf);
}

return 0;
}


/**********************************************************************
* Compiler: GCC
* Last Update: Sat 12 Nov 2011 11:17:13 PM CST
* File Name: myClientMulticast2.c
* Description:
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#define _DEBUG
#define MAXBUF 1024
#define PORT 60000

int main(int argc, char **argv)
{
int myFd, clientFd;
struct sockaddr_in myAddr, clientAddr;
struct ip_mreq mreq;
int addrlen = sizeof(clientAddr);
char buf[MAXBUF];
char addrTemp[INET_ADDRSTRLEN];

bzero(&myAddr, sizeof(myAddr));
bzero(&clientAddr, sizeof(clientAddr));
//创建套接字,datagrams
if((myFd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
printf("%s Line number:%d socket()错误码:%d, %s\n", \
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}

//设置本地地址端口信息
myAddr.sin_family = AF_INET;
myAddr.sin_addr.s_addr = INADDR_ANY;
if (argc == 3) {
myAddr.sin_port = htons(atoi(argv[2]));
} else {
myAddr.sin_port = htons(PORT);
}

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

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

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

//对struct ip_mreq这个结构体赋值
if (argc > 1) { //设置IP地址
int res;
if ((res = inet_pton(AF_INET, argv[1], &mreq.imr_multiaddr)) == -1) {
printf("%s Line number:%d setsockopt()错误码:%d, %s\n", \
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
} else if(res == 0) {
printf("IP地址无效\n");
printf("请输入一个多播地址:224.0.0.1 ~ 239.255.255.255\n");
return 0;
}
} else {
printf("Usage:%s 多播地址(224.0.0.1 ~ 239.255.255.255)\n", argv[0]);
return(0);
}
mreq.imr_interface.s_addr = INADDR_ANY;
//将本机加入多播组中
if (setsockopt (myFd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) {
printf("%s Line number:%d setsockopt()错误码:%d, %s\n", \
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}

printf("客户端已启动,等待多播消息.....\n");
while (1) {
bzero(buf, sizeof(buf));
if (recvfrom(myFd, buf, sizeof(buf) - 1, 0,
(struct sockaddr *)&clientAddr, &addrlen) == -1) {
printf("%s Line number:%d recvfrom()错误码:%d, %s\n", \
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}
printf("收到来自%s的消息:%s",
inet_ntop(AF_INET, &clientAddr.sin_addr, addrTemp, sizeof(addrTemp)), buf);
if (strcmp("exit\n", buf) == 0) {
break;
}
}
//退出广播组
if (setsockopt (myFd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) {
printf("%s Line number:%d setsockopt()错误码:%d, %s\n", \
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}

return 0;
}


Mark0904 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

你的网络模式不对
[/Quote]
为什么同样的模式,有线上网就可以,无线上网就不行?
你说我的网模式不对,请问错在哪里?
wsxxiaohao 2012-05-13
  • 打赏
  • 举报
回复
你的网络模式不对
liuwons 2012-05-12
  • 打赏
  • 举报
回复
换成有线就可以了?有点费解,,,
Mark0904 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

虚拟机NAT上网,LINUX与WINDOWS没有组成局域网,相当于WINDOWS下VM作为NAT服务器,将LINUX虚拟网卡发到WINDOWS虚拟网卡的包修改为从WINDOWS物理网卡发出。

你同学收到的其实都是被NAT后源IP为你WINDOWS物理网卡IP的UDP广播。
[/Quote]

忘了说下了,我用的是桥接上网模式
Mark0904 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

在虚拟机里能ping的通主机吗
[/Quote]
能ping通。就是收不到广播
Mark0904 2012-05-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

虚拟机的网段和主机windows的网络在一个网段里吗?
[/Quote]
是在同个网段
qq120848369 2012-05-12
  • 打赏
  • 举报
回复
虚拟机NAT上网,LINUX与WINDOWS没有组成局域网,相当于WINDOWS下VM作为NAT服务器,将LINUX虚拟网卡发到WINDOWS虚拟网卡的包修改为从WINDOWS物理网卡发出。

你同学收到的其实都是被NAT后源IP为你WINDOWS物理网卡IP的UDP广播。
scream7 2012-05-12
  • 打赏
  • 举报
回复
在虚拟机里能ping的通主机吗
自信男孩 2012-05-11
  • 打赏
  • 举报
回复
虚拟机的网段和主机windows的网络在一个网段里吗?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧