《winsock2网络编程 实用教程》第7章的多播例子,
在我机子上运行时,出现“joinleaf error”,这是为什么啊?
源码在下面,大家帮我看看,谢谢了
源码下载地址:
http://lspbeyond.zj.com/a.htm

解决方案 »

  1.   

    基本上不需要单独配置,Win98及以上的系统都支持了。网卡是绝对支持的,只要你的网卡不是老掉牙的那种。
    无论是单机还是多台机器,都是可以正常使用的。
    下面是我从自己的一个程序里面复制出来的一段代码(部分),只是做个参考。
    ////这个是用来创建/加入一个多播组的函数,各个参数解释如下:
    //sock 用来返回UDP套接字的。
    //mSock 用来返回多播套接字的,多播组的数据就在它上面接收。
    // local 用来存放sock那个套接字信息的。
    //mAddr 用来存放多播组套接字信息的。
    //mPort 这个多播组要使用的端口
    //mIP 多播组IP,例如:"224.0.0.99"
    long createMSock(SOCKET *sock,SOCKET *mSock,sockaddr_in *local,sockaddr_in *mAddr ,unsigned short mPort,char *mIP){
    DWORD cbRet;
    BOOL bFlag;  WSAData wsaData;
    if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0 ){
    MessageBox(NULL,"WinSock 初始化失败!\n请检查Windows版本及WinSock版本是否过低", "错误", MB_OK |MB_ICONERROR);
    WSACleanup();
            return -1;
        }
        *sock = WSASocket(AF_INET, SOCK_DGRAM, 0,NULL,0,
    WSA_FLAG_OVERLAPPED | WSA_FLAG_MULTIPOINT_C_LEAF | WSA_FLAG_MULTIPOINT_D_LEAF); //创建一个UDP套接口 bFlag=TRUE; //设置套接字选项,使套接字为可重用端口地址
    setsockopt(*sock,SOL_SOCKET,SO_REUSEADDR,(char*)&bFlag,sizeof(bFlag));    memset(local, 0, sizeof(*local));
        local->sin_family = AF_INET;
        local->sin_port = htons(mPort);
        local->sin_addr.S_un.S_addr = locaIP;   //这个locaIP是在别处定义的,赋的值是本机的IP。因为我发现当由程序自动选择IP时有时会是外网IP,就无法和网内多播通信了,所以就用个变量,使用的是确定的局域网IP
    if (bind(*sock, (sockaddr*)(local), sizeof(*local))==SOCKET_ERROR){
    MessageBox(NULL,"端口被占用,程序无法继续运行!\n请关闭其它应用程序后再试", "错误", MB_OK |MB_ICONERROR);
    WSACleanup();
            return -2;
    } //设置多播数据报传播范围(生存时间TTL)
    const int m_nTTL = 1;
    WSAIoctl(*sock,SIO_MULTICAST_SCOPE,(void *)&m_nTTL,sizeof(int),NULL,0,&cbRet,NULL,NULL);
    //设置多播返回(LOOKBACK)
    const int nLoopBack = 1; //禁止回馈
    WSAIoctl(*sock,SIO_MULTIPOINT_LOOPBACK,(void *)&nLoopBack,sizeof(nLoopBack), NULL,0,&cbRet,NULL,NULL);    memset(mAddr, 0, sizeof(*mAddr));
    mAddr->sin_family=AF_INET;
    mAddr->sin_port=htons(mPort);
    mAddr->sin_addr.S_un.S_addr=inet_addr(mIP);
    *mSock=WSAJoinLeaf(*sock,(SOCKADDR*)mAddr,sizeof(*mAddr),0,0,0,0,JL_BOTH);
    if(*mSock==INVALID_SOCKET){
    MessageBox(NULL,"无法创建多播应用,程序无法继续运行!\n请检查操作系统是否允许多播", "错误", MB_OK |MB_ICONERROR);
    WSACleanup();
            return -3;
    }
        return 0;
    }
      

  2.   

    我的问题也就是在这里出错了
    *mSock=WSAJoinLeaf(*sock,(SOCKADDR*)mAddr,sizeof(*mAddr),0,0,0,0,JL_BOTH);
    if(*mSock==INVALID_SOCKET){
    MessageBox(NULL,"无法创建多播应用,程序无法继续运行!\n请检查操作系统是否允许多播", "错误", MB_OK |MB_ICONERROR);
    WSACleanup();
            return -3;
    }
      

  3.   

    系统是Win98吗?如果是,好像禁止多播回馈会导致出错。但你大概用的不会是Win98.Win2000/XP在加入多播组时出错,抱歉,我解释不了。
      

  4.   

    我的系统是win2k professional
    哪位好心的大侠能否帮我看看那个源码,我给了下载地址的
      

  5.   

    刚才看了你的代码了,你源代码中MulticastDlg.cpp的247行,原本是:
    WSABUF wsaCalleeData;
    改成下面的就行了:
    WSABUF wsaCalleeData={0};
    出错的原因就是没有初始化,wsaCalleeData中的数据是不确定的,呵呵。
      

  6.   

    WSABUF wsaCalleeData;
    改成下面的就行了:
    WSABUF wsaCalleeData={0};
      

  7.   

    maplevsred(残桓枫雪) :
    你说得对!!太感谢了!!!