当前位置:  技术问答>linux和unix

主机通过wifi上网无法收到虚拟机的广播或多播消息?有线上网就可以。

    来源: 互联网  发布时间:2017-02-22

    本文导语:  我的主机是win7,通过WIFI上网,用的是vmware8,在虚拟机linux系统里写了一个简单的UDP广播或多播程序,但主机收不到该广播消息, 若我换成有线上网,则主机能收到广播或多播消息。 不知道原因是什么? /**************...

我的主机是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 
#include 
#include 
#include 
#include 
#include 
#include 
#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, %sn", 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, %sn", errno, strerror(errno));
            exit(errno);
        } else if(res == 0) {
            printf("IP地址无效n");
            printf("请输入一个多播地址:224.0.0.1 ~ 239.255.255.255n");
            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, %sn", errno, strerror(errno));
            exit(errno);
        }
        printf("成功给对方发送消息:%s", buf);
    }

    return 0;
}


/**********************************************************************
* Compiler: GCC
* Last Update:  Mon 14 May 2012 06:48:56 PM CST
* File Name: myClientMulticast2.c
* Description: 
************************************************************************/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#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, %sn", 
                __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, %sn", 
                __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, %sn", 
                __FILE__, __LINE__, errno, strerror(errno));
        exit(errno);
    }

    //设置IP_MULTICAST_TTL 为1,即该多播最多只能经过一个路由器
    u_char ttl;
    if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) != 0) {
        printf("%s Line number:%d setsockopt()错误码:%d, %sn", 
                __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, %sn", 
                __FILE__, __LINE__, errno, strerror(errno));
            exit(errno);
        } else if(res == 0) {
            printf("IP地址无效n");
            printf("请输入一个多播地址:224.0.0.1 ~ 239.255.255.255n");
            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, %sn", 
                __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, %sn", 
                    __FILE__, __LINE__, errno, strerror(errno));
            exit(errno);
        }
        printf("收到来自%s的消息:%s", 
                inet_ntop(AF_INET, &clientAddr.sin_addr, addrTemp, sizeof(addrTemp)), buf);
        if (strcmp("exitn", buf) == 0) {
            break;
        }
    }
    //退出广播组
    if (setsockopt (myFd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) {
        printf("%s Line number:%d setsockopt()错误码:%d, %sn", 
                __FILE__, __LINE__, errno, strerror(errno));
        exit(errno);
    }

    return 0;
}



|
 u_char ttl;//没赋值?
    if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) != 0) {
        printf("%s Line number:%d setsockopt()错误码:%d, %sn", 
                __FILE__, __LINE__, errno, strerror(errno));
        exit(errno);
    }

|
多播这个东西不是说路由器不一定支持吗.

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 主机访问桥接虚拟机web服务器失败,同网段其他主机可以访问
  • vmware虚拟机linux不能ping通主机,主机能ping通虚拟机
  • 我在windows下telnet到linux主机,想得到linux主机的一个文件该怎么办?
  • 更改主机名,用hostname更改后启动,又是原来的主机名
  • 主机能ping到虚拟机,但虚拟机ping主机不成功。
  • 不同ip,相同主机名的unix系统会不会冲突?主机名用什么命令改?
  • 在linux下,如何访问另一台linux主机?如何访问windows主机?
  • sftp实现两台主机之间传输文件(把一个主机中的文件拷贝到另一个)
  • 有没有办法编个叫本代替我登陆到自己的主机, 执行FTP命令下载另一个主机的文件?
  • unix 下 C++实现 ftp 到另一台主机上 修改文件内容 !能不能直接在主机上修改 还是只能get下来本地修改完后 在put上去
  • 为什么用new socket(主机名,端口号)的方法连接不上用serversocket(端口号)的主机
  • linux获取主机名后用gethostbyname() 不能获取主机ip
  • 怎样使两个主机的连通
  • linux 主机名配置问题
  • scp远程两台主机时如何指定端口
  • rh9如何修改主机。
  • 主机ping不通虚拟机
  • hostname改变主机名
  • linux下主机名和域名如何设置
  • <请教如何把IP地址转为主机名,焦急等待中...请高手帮忙>


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3