各位大侠,想做多个线程同时接收组播组中的数据,怎么办?

解决方案 »

  1.   

    线程函数中这么写就可以了SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);
    if(INVALID_SOCKET == s)
    {
     // Error;
     return 1;
    }
    BOOL bReuse = TRUE;
    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&bReuse, sizeof(BOOL));
    SOCKADDR_IN si;
    si.sin_family = AF_INET;
    si.sin_port = ntohs(4567+nIndex); // 这里的nIndex为线程的索引号
    si.sin_addr.S_un.S_addr = INADDR_ANY;
    if(SOCKET_ERROR == bind(s, (LPSOCKADDR)&si, sizeof(si))
    {
     // Error;
     closesocket(s);
     return 1;
    }
    ip_mreq mcase;
    mcast.imr_interface.S_un.S_addr = INADDR_ANY;
    mcast.imr_multiaddr.S_un.S_addr = inet_addr("234.5.6.7"); // 这里是你的多播地址
    setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mcast, sizeof(mcast));
    printf("recv data ...\n");
    char buf[1024] = {0};
    int nAddLen = sizeof(si);
    while(TRUE)
    {
     if(SOCKET_ERROR == recvfrom(s, buf, 1024, 0, (LPSOCKADDR)&si, &nAddrLen))
     {
       // ERROR;
       closesocket(s);
       break;
     }
     else
     {
       printf("recv data: %s\n", buf);
     }
    }