免费注册 查看新帖 |

Chinaunix

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

VMWare里的Linux收不到宿主Windows发的UDP包! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-11 18:23 |只看该作者 |倒序浏览
我在一台电脑里测试UDP,宿主系统是Windows XP,VMWare里装的是Linux(Fedora,Linux防火墙已经禁用。
现在的问题是,Linux里的测试程序总是收不到Windows发来的UDP包,表现为调用recvfrom()时被阻塞,无法返回。
我用tcpdump工具可以查看到Windows的确已经发送了UDP包至Linux。
后来,我又做了以下三个测试:
(一)在Linux里发UDP包到Windows,结果Windows可以收到UDP包。
(二)在Linux里发UDP包到Linux自身,结果也能收到UDP包。
(三)在Windows里发UDP包到Windows自身,结果同样可以收到UDP包。

以上测试用的是大致相同的代码,但为何会有这种现象,请大家帮忙解决一下,忠心感谢!
(初次进来无可用积分,以后一定加倍反还)

论坛徽章:
0
2 [报告]
发表于 2008-05-11 18:39 |只看该作者
code?

论坛徽章:
0
3 [报告]
发表于 2008-05-11 18:55 |只看该作者

回复 #2 swordfish.cn 的帖子

// Linux 下的代码


#include <iostream>
#include <cstdlib>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

using namespace std;

int main(int argc, char *argv[])
{
    int s;
    char buffer[10];
   
    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s < 0)
    {
        cout << "socket() error!" << endl;
    }
   
    sockaddr_in addr;
    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(5555);
   
    if (bind(s, (sockaddr*)(&addr), sizeof(addr)))
    {
        cout << "bind() error!" << endl;
    }
   
    while (1)
    {
        int recvSize;
        sockaddr_in recvAddr;
        socklen_t recvAddrLen = sizeof(recvAddr);
        bzero(&recvAddr, sizeof(recvAddr));
        
        recvSize = recvfrom(s, buffer, sizeof(buffer), 0, (sockaddr*)(&recvAddr), &recvAddrLen);
        if (recvSize < 0)
        {
            cout << "recvfrom() error!" << endl;
            continue;
        }
        
        int sendSize;
        sendSize = sendto(s, buffer, sizeof(buffer), 0, (sockaddr*)(&recvAddr), sizeof(recvAddr));
        if (sendSize < 0)
        {
            cout << "sendto() error!" << endl;
            continue;
        }
        
        cout << buffer << endl;
    }
    return EXIT_SUCCESS;
}

论坛徽章:
0
4 [报告]
发表于 2008-05-12 01:48 |只看该作者
可能和虚拟机连接网络的方式有关NAT方式会有问题

论坛徽章:
0
5 [报告]
发表于 2008-05-12 12:57 |只看该作者
看不出来什么问题吧,检查一下虚拟机的网络设置。

论坛徽章:
0
6 [报告]
发表于 2008-05-12 15:40 |只看该作者

回复 #5 swordfish.cn 的帖子

VMWare 版本是 6.0.3 build-80004
Enternet设置为 Bridged

如果说是VMWare网络设置问题,那为什么用tcpdump能看到接收的UDP包呢?很有可能是UDP包无法到达Linux里才对呀,我想问题还没有清晰~

论坛徽章:
0
7 [报告]
发表于 2008-05-12 15:59 |只看该作者
你能用 TCPDump 收到包,那不就证明了包已经到达了 Linux 吗?

论坛徽章:
0
8 [报告]
发表于 2008-05-13 12:01 |只看该作者

回复 #7 swordfish.cn 的帖子

>> Linux里的测试程序总是收不到Windows发来的UDP包!!!

希望认真理解问题,谢谢!

论坛徽章:
0
9 [报告]
发表于 2008-05-30 11:57 |只看该作者
请教两个问题:
这个程序中传递包的内容是什么,在window中是如何收你发的这个包的,也就是你怎么知道他发了没有,又发了什么

论坛徽章:
0
10 [报告]
发表于 2008-06-01 15:31 |只看该作者
原帖由 jiony 于 2008-5-30 11:57 发表
请教两个问题:
这个程序中传递包的内容是什么,在window中是如何收你发的这个包的,也就是你怎么知道他发了没有,又发了什么


同楼上的问下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP