#pragma comment(lib,"ws2_32.lib")
#include <STDIO.h>
#include <WINSOCK2.H>
#include <WS2tcpip.h>
void HandleError(char *);

int main(int argc,char *argv[])
{
    WSAData wsaData;
    WSAStartup(WINSOCK_VERSION,&wsaData);
    struct sockaddr_in addr;
    memset(&addr,0,sizeof(addr));
    addr.sin_addr.s_addr=inet_addr("192.168.1.101");
    addr.sin_family=AF_INET;
    addr.sin_port=htons(9999);
    SOCKET sock=socket(AF_INET,SOCK_DGRAM,0);
    if(bind(sock,(struct sockaddr*)&addr,sizeof(addr))==SOCKET_ERROR){
    printf("bind:%d\n",WSAGetLastError());
    }
 
    struct in_addr mcaddr;
    mcaddr.s_addr=inet_addr("226.1.2.3");
    if(mc_join(sock,&mcaddr,&(addr.sin_addr))==SOCKET_ERROR){
    printf("Join Multcast Group:%d\n",WSAGetLastError());}
    char buf[65];
    if(recvfrom(sock,buf,64,0,NULL,NULL)==SOCKET_ERROR){
        printf("recvfrom:%d\n",WSAGetLastError());
    break;
    }
    else
        printf("recvd:%s\n",buf);
}
void HandleError(char *func)
{
    int errCode=WSAGetLastError();
    char info[65]={0};
    _snprintf(info,64,"%s:%d\n",func,errCode);
    printf(info);
}
int mc_join(SOCKET s,struct in_addr *mcaddr,struct in_addr *local_if)
{//mcaddr 多播地址,local_if欲加入多播组的本地IP地址
  struct ip_mreq mreq;//IP_ADDR_MEMBERSHIP选项值
  memcpy(&(mreq.imr_interface),local_if,sizeof(struct in_addr));
  memcpy(&(mreq.imr_multiaddr),mcaddr,sizeof(struct in_addr));

  return(setsockopt(s,IPPROTO_IP ,IP_ADD_MEMBERSHIP,(char*)&mreq,sizeof(mreq)));

 }