书上的多播例子,为什么在我机子上跑不起来
日期:2007-09-15 荐:
书上的多播例子,为什么在我机子上跑不起来《winsock2网络编程 实用教程》第7章的多播例子,在我机子上运行时,出现“joinleaf error”,这是为什么啊?源码在下面,大家帮我看看,谢谢了源码下载地址:http://lspbeyond.zj.com/a.htm你是不是单机运行?是的,有什么问题?我在两台机子上跑过,都不行。多播是不是需要配置一下环境的,如添加协议,或者网卡支持什么的?基本上不需要单独配置,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 初始化失败!请检查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,就无法和网内多播通信了,所以就用个变量,使用的是确定的局域网IPif (bind(*sock, (sockaddr*)(local), sizeof(*local))==SOCKET_ERROR){MessageBox(NULL,"端口被占用,程序无法继续运行!请关闭其它应用程序后再试", "错误", 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,"无法创建多播应用,程序无法继续运行!请检查操作系统是否允许多播", "错误", MB_OK |MB_ICONERROR);WSACleanup(); return -3;} return 0;}楼上,粗看了一下,你的代码和那本书的一样啊,我的问题也就是在这里出错了*mSock=WSAJoinLeaf(*sock,(SOCKADDR*)mAddr,sizeof(*mAddr),0,0,0,0,JL_BOTH);if(*mSock==INVALID_SOCKET){MessageBox(NULL,"无法创建多播应用,程序无法继续运行!请检查操作系统是否允许多播", "错误", MB_OK |MB_ICONERROR);WSACleanup(); return -3;}系统是Win98吗?如果是,好像禁止多播回馈会导致出错。但你大概用的不会是Win98.Win2000/XP在加入多播组时出错,抱歉,我解释不了。我的系统是win2k professional哪位好心的大侠能否帮我看看那个源码,我给了下载地址的刚才看了你的代码了,你源代码中MulticastDlg.cpp的247行,原本是:WSABUF wsaCalleeData;改成下面的就行了:WSABUF wsaCalleeData={0};出错的原因就是没有初始化,wsaCalleeData中的数据是不确定的,呵呵。WSABUF wsaCalleeData;改成下面的就行了:WSABUF wsaCalleeData={0};
标签: