书上的多播例子,为什么在我机子上跑不起来 《winsock2网络编程 实用教程》第7章的多播例子,在我机子上运行时,出现“joinleaf error”,这是为什么啊?源码在下面,大家帮我看看,谢谢了源码下载地址:http://lspbeyond.zj.com/a.htm 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 基本上不需要单独配置,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;} 我的问题也就是在这里出错了*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; } 系统是Win98吗?如果是,好像禁止多播回馈会导致出错。但你大概用的不会是Win98.Win2000/XP在加入多播组时出错,抱歉,我解释不了。 我的系统是win2k professional哪位好心的大侠能否帮我看看那个源码,我给了下载地址的 刚才看了你的代码了,你源代码中MulticastDlg.cpp的247行,原本是: WSABUF wsaCalleeData;改成下面的就行了: WSABUF wsaCalleeData={0};出错的原因就是没有初始化,wsaCalleeData中的数据是不确定的,呵呵。 WSABUF wsaCalleeData;改成下面的就行了:WSABUF wsaCalleeData={0}; maplevsred(残桓枫雪) :你说得对!!太感谢了!!! 注册表里面的内容,哪些类型是大小写敏感的,哪些是不敏感的? 用VS2008如何建立类似CSDN论坛主页的界面 大家谁有过技术入股经验 对话框问题 if (!ProcessShellCommand(cmdInfo))出错了! **请教:VC编译出来的ocx控件,不能在pb中注册?怎么回事啊********** 怎样在系统托盘区动态显示提示信息? 怎么让CDialog响应WM_KEYDOWN这个消息 VS2012用ODBC向MySQL插入图片报错,求解!! 请问如何强制刷新注册表? Help!如何读注册表的值??急!急! 怎样使得exe文件在IE中运行,详情请进!
无论是单机还是多台机器,都是可以正常使用的。
下面是我从自己的一个程序里面复制出来的一段代码(部分),只是做个参考。
////这个是用来创建/加入一个多播组的函数,各个参数解释如下:
//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;
}
*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;
}
哪位好心的大侠能否帮我看看那个源码,我给了下载地址的
WSABUF wsaCalleeData;
改成下面的就行了:
WSABUF wsaCalleeData={0};
出错的原因就是没有初始化,wsaCalleeData中的数据是不确定的,呵呵。
改成下面的就行了:
WSABUF wsaCalleeData={0};
你说得对!!太感谢了!!!