int ret ;
const int on = 1; //允许程序的多个实例运行在同一台机器上
ret = setsockopt(server, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
if( ret == SOCKET_ERROR )
{
WSACleanup();
//加入一个多播组
ret = setsockopt(server,IPPROTO_IP,IP_ADD_MEMBERSHIP,\
(char*)&mreq,sizeof(mreq));
if( ret == SOCKET_ERROR )
{
WSACleanup();
cout<<"Error in setsockopt(IP_ADD_MEMBERSHIP): "<<WSAGetLastError()<<endl;
return ;
}
int sinlen = sizeof(local);
if (getsockname(server, (struct sockaddr *) &local, &sinlen) < 0)
{
closesocket(server);
server = -1;
return ;
}
int flags = 1;
if (ioctlsocket(server,FIONBIO,(unsigned long *) &flags))
{
closesocket(server);
server = -1;
return ;
}
#else
/*创建一个SOCK_DGRAM类型的SOCKET
其中,WSA_FLAG_MULTIPOINT_C_LEAF表示IP多播在控制面层上属于 "无根 "类型;
WSA_FLAG_MULTIPOINT_D_LEAF表示IP多播在数据面层上属于 "无根 ",有关控制面层和
数据面层有关概念请参阅MSDN说明。*/
if((server=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,
WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED))
== INVALID_SOCKET)
{
printf( "socket failed with:%d\n ",WSAGetLastError());
WSACleanup();
return ;
}
int ret ;
const int on = 1; //允许程序的多个实例运行在同一台机器上
ret = setsockopt(server, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
if( ret == SOCKET_ERROR )
{
WSACleanup();