关于组播问题,急急急!
谁能给我一套创建点对多点和多点对多点的组播模型的代码? 问题点数:36、回复次数:1Top
1 楼caiyi9000(小猫)回复于 2001-06-30 15:09:11 得分 36
给你一个接口函数,它创建一个单向发送或单向接收或双向发送和接收的组播socket
BOOL McSocket::Create (int McFlag)
//McFlag:组播类型
{
//make sure the protocol and capacity exit
WORD wVersionRequested; //request version of winsock
WSADATA wsaData; //returned sock data
int rightsock=0;
int ret;
WSAPROTOCOL_INFO* Proto_Info=NULL;
DWORD length=0;
BOOL Multicast_Supported=FALSE;
INT iProto[2];
wVersionRequested = MAKEWORD( 2,2);
ret = WSAStartup( wVersionRequested, &wsaData ); //initial winsock
if ( ret != 0 )
{
m_Errmsg="Winsock 启动失败";
return FALSE;
}
else if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 ) //check version
{
m_Errmsg="Winsock 版本不对,请使用WINSOCK2.2";
WSACleanup( );
return FALSE;
}
else //check protocol and capacity
{
iProto[0]=IPPROTO_UDP;
iProto[1]=NULL;
ret=WSAEnumProtocols(iProto, (LPWSAPROTOCOL_INFO)Proto_Info,&length);
if(ret==SOCKET_ERROR && WSAGetLastError() ==WSAENOBUFS)
{
Proto_Info=new WSAPROTOCOL_INFO[length/sizeof(WSAPROTOCOL_INFO)];
if(Proto_Info==NULL)
{
m_Errmsg="申请内存时出错";
WSACleanup();
return FALSE;
}
ret=WSAEnumProtocols(iProto, (LPWSAPROTOCOL_INFO)Proto_Info,&length);
if(ret==SOCKET_ERROR)
{
ret=WSAGetLastError();
m_Errmsg.Format("无法读取协议信息,错误代码:%d",ret);
delete[] Proto_Info;
WSACleanup();
return FALSE;
}
}
//mod 1/9 else
//mod 1/9 {
for(int j=0;j<ret;j++)
{
if(Proto_Info[j].dwServiceFlags1 & XP1_SUPPORT_MULTIPOINT !=0
&& Proto_Info[j].iAddressFamily==AF_INET )
{
Multicast_Supported=TRUE;
rightsock=j;
break; ///mod 1/9 IMPORTANT!!!!
}
}
if(!Multicast_Supported)
{
m_Errmsg="系统不支持组播或无相应协议";
WSACleanup();
return FALSE;
}
//mod 1/9 }
}
//create a multipoint socket
m_Socket=WSASocket(FROM_PROTOCOL_INFO ,
FROM_PROTOCOL_INFO ,
FROM_PROTOCOL_INFO ,
(LPWSAPROTOCOL_INFO)&(Proto_Info[rightsock]),
0,
WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);
if(m_Socket==INVALID_SOCKET)
{
ret=WSAGetLastError();
m_Errmsg.Format("创建SOCKET时发生异常,错误代码:%d",ret);
delete[] Proto_Info;
WSACleanup( );
return FALSE;
}
delete[] Proto_Info;
//set the socket notification message
if(WSAAsyncSelect(m_Socket,m_hWnd ,IP_EVENT,FD_CONNECT | FD_CLOSE | FD_WRITE | FD_READ)==SOCKET_ERROR )
{
ret=WSAGetLastError();
m_Errmsg.Format( "在设定操作通知时出错,错误代码:%d",ret);
closesocket(m_Socket);
WSACleanup( );
return FALSE;
}
//假如一个多播组
if(WSAJoinLeaf(m_Socket, (struct sockaddr FAR * )&m_MultiGroup, sizeof(sockaddr), NULL, NULL, NULL, NULL, McFlag) == INVALID_SOCKET)
{
ret=WSAGetLastError();
m_Errmsg.Format(" 加入多点组时出错,错误代码:%d",ret);
closesocket(m_Socket);
WSACleanup( );
return FALSE;
}
return TRUE;
}
Top
相关问题
- 关于多媒提组播的几个问题,急急急!!!!
- 组播-----急!!!!!!
- 急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急
- 急急急急急急急急急急~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!!!!
- 急急急急急急急急急急!
- 急急急急急急急急急急!!!!!!!
- 急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!
- 急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急,VB菜鸟问,急急急急急急急急急急急急急急急急急急急急急急急急急急急急
- 急!急!急!急!急!急!急!
- 急急急急急急急??????




