Re[6]: Получение данных мультикастом
От: prrt  
Дата: 01.03.17 18:46
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Я бы рекомендовал для начала нарисовать минимальный пример на обычных беркли-сокетах, безо всякого asio.


А Вы не посоветуете какой-нибудь подобный пример? Наверняка должны быть готовые решения. Я погуглил, но то, что нашел, тоже не заработало (вечное ожидание данных), например:

#define PORT  30001
#define BSIZE 256
 
int main()
{
    struct sockaddr_in  sin;
    char   *buffer[ BSIZE ];
    int    sock;
    int    bytes_read;
    socklen_t    sin_len;
    struct ip_mreq mreq;
 
    /* Setup address */
    memset( &sin, 0, sizeof( sin ) );
    sin.sin_family = AF_INET;
    sin.sin_port = htons( PORT );
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    sin_len = sizeof( sin );
 
    /* Create socket */
    sock = socket( AF_INET, SOCK_DGRAM, 0 );
    if ( sock > 0 )
    {
        if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
            perror("bind");
            exit(1);
        }
        string group = "239.255.0.1";
        string locAddr = "192.168.2.2";
        mreq.imr_multiaddr.s_addr = inet_addr(group.c_str());
        mreq.imr_interface.s_addr = inet_addr(locAddr.c_str());
        if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))< 0) {
            perror("setsockopt");
            exit(1);
        }        
        /* Display any data found */
        while( 1 )
        {
            bytes_read = recvfrom( sock, buffer, sizeof( buffer ), 0, ( struct sockaddr * ) &sin, &sin_len );
            if ( bytes_read > 0 )
            {
                printf( "%s\n", buffer );
            }
        }
    }
    
    return 0;
}


Проверять могу только на машине с несколькими интерфейсами, на которые поступают разные данные. При этом сам UDP поток изменять не могу, он поступает на один из этих интерфейсов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.