struct sockaddr_in addr,local;
struct ip_mreq      mcast; //多播组 SOCKET csMultiCast;
DWORD dwInterface,dwMulticastGroup;
dwInterface = INADDR_ANY;
dwMulticastGroup = inet_addr("224.8.8.1");
int ttl = 255 ;  local.sin_family = AF_INET;
local.sin_port   = htons(8888);
local.sin_addr.s_addr = dwInterface;
WSADATA WSAData;
WORD  wVersionRequested;
wVersionRequested = MAKEWORD(2, 2);
   if (WSAStartup (wVersionRequested , &WSAData) != 0) 
{
    AfxMessageBox("初始化多播套接字失败!");
PostQuitMessage(1);
}
if (LOBYTE(WSAData.wVersion) != 2 || HIBYTE(WSAData.wVersion) != 2 ) 
{
WSACleanup( );
AfxMessageBox("套接字版本不对!");
PostQuitMessage(1);
}  addr.sin_family = AF_INET;
addr.sin_port = htons(gm_uPort);
addr.sin_addr.s_addr = inet_addr(gm_strIpaddr);

if ((csMultiCast=socket(AF_INET,SOCK_DGRAM,0)) < 0) 
{
AfxMessageBox("建立多播套接字失败!");
PostQuitMessage(1);
}

if (bind(csMultiCast, (struct sockaddr *)&local, 
sizeof(local)) == SOCKET_ERROR)
{
AfxMessageBox("bind failed ");
closesocket(csMultiCast);
WSACleanup();
PostQuitMessage(1);
} mcast.imr_multiaddr.s_addr = dwMulticastGroup;
mcast.imr_interface.s_addr = dwInterface; if (setsockopt(csMultiCast, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(char *)&mcast, sizeof(mcast)) == SOCKET_ERROR)
{
CString ss;
ss.Format("setsockopt(IP_ADD_MEMBERSHIP) failed: %d\n",
WSAGetLastError()); //为什么有时候出现这个错误?
AfxMessageBox(ss);
closesocket(csMultiCast);
WSACleanup();
PostQuitMessage(1);
} if(setsockopt(csMultiCast, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl))!=0) 
{
CString str;
str.Format("设置套接字多播选项失败! ErrorCode:%d",GetLastError());
AfxMessageBox(str);
PostQuitMessage(1);
}//我把代码贴上,高手请指点一下小弟

解决方案 »

  1.   

    DWORD dwerr = WSAGetLastError());
    错误码是多少?
      

  2.   

    在bind()后,添加以下
    if (setsockopt (Sock, 
                      SOL_SOCKET, 
                      SO_BROADCAST, 
                      (char*) &TRUE, 
                      sizeof(TRUE)) == SOCKET_ERROR){}  if (setsockopt (Sock, 
                      SOL_SOCKET, 
                      SO_REUSEADDR, 
                      (char*) &TRUE, 
                      sizeof(TRUE)) == SOCKET_ERROR){}
      

  3.   

    先设置重用:
    int error=0;BOOL ReuseAddress=true;
    error=setsockopt(m_socket,SOL_SOCKET,SO_REUSEADDR,
    (char *)&ReuseAddress,sizeof(ReuseAddress));
    if(error!=0)
    {
    TRACE("设置重用地址错误!");
    return FALSE;
    }再绑定