2016-12-21 2 views
0

Как я могу присоединиться к группе потоков многопериодного mpeg с адресом udp://@224.1.50.15:1234? Я хочу управлять только для того, чтобы установить соединение с потоковым сервером, чтобы сервер узнал о том, что меня интересует эта группа многоадресной рассылки, чтобы заставить сервер отправлять мне потоковые пакеты в течение определенного периода времени.C++ Как я могу присоединиться к потоку многоадресной передачи?

Для примера: Я не получаю никаких пакетов из этой группы многоадресной передачи, пока не установит соединение с группой с VLC Player. Даже после того, как я закрыл VLC Player, я продолжаю получать пакеты из группы в течение короткого периода времени. То, что я пытаюсь сделать, - это получать пакеты без помощи VLC Player или любого другого стороннего приложения.

Как я могу связаться с этой группой для указанной выше цели. Если это возможно?

P.S: У меня установлено 4 сетевых интерфейса.

Спасибо!

Рекомендация Zaboj Campula в его ответе на этой странице; я изменил код, как показано ниже. Который дает мне ошибку 10093.

struct ip_mreq { 
    struct in_addr imr_multiaddr; /* IP multicast address of group */ 
    struct in_addr imr_interface; /* local IP address of interface */ 
}; 
SOCKET  s; 
SOCKADDR_IN localif; 
struct ip_mreq mreq; 
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
localif.sin_family = AF_INET; 
localif.sin_port = htons(1234); 
localif.sin_addr.s_addr = INADDR_ANY; 
bind(s, (SOCKADDR *)&localif, sizeof(localif)); 
mreq.imr_interface.s_addr = INADDR_ANY; //Writing here my local ip didn't change the result. 
mreq.imr_multiaddr.s_addr = inet_addr("224.1.50.15"); 
int rc = NO_ERROR; 
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
// Join the group 
rc = setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)); 
if (rc == SOCKET_ERROR) 
{ 
    printf("JoinMulticastGroup: setsockopt failed with error code %d\n", WSAGetLastError()); 
} 
else 
{ 
    printf("Joined group: "); 
    //PrintAddress(group->ai_addr, group->ai_addrlen); 
    printf("\n"); 
} 
+0

Пока кто-то будет писать ответ на мою тему, я решил использовать 'libvlc_media_new_location' функцию от' libvlc.lib'. На мой взгляд, это слишком много для этой цели. – swartkatt

ответ

0

Хорошо, мне удалось решить мою проблему с помощью книги Multicast Sockets Practical Guide for Programmers which is written by David Makofske & Kevin Almeroth

Спасибо идет к писателям и Zaboj Campula за их усилия ,

Я надеюсь, что этот пост и ответ помогут многим другим в будущем. Рабочий код написан ниже! Собран с Visual Studio 2017 RC (Консольный пустой проект C)

int sock;      /* socket descriptor */ 
int flag_on = 1;    /* socket option flag */ 
struct sockaddr_in mc_addr; /* socket address structure */ 
char recv_str[MAX_LEN + 1];  /* buffer to receive string */ 
int recv_len;     /* length of string received */ 
struct ip_mreq mc_req;  /* multicast request structure */ 
char* mc_addr_str;   /* multicast IP address */ 
unsigned short mc_port;  /* multicast port */ 
struct sockaddr_in from_addr; /* packet source */ 
unsigned int from_len;  /* source addr length */ 
WSADATA wsaData;    /* Windows socket DLL structure */ 

mc_addr_str = "224.1.50.15";  /* arg 1: multicast ip address */ 
mc_port = atoi("1234"); /* arg 2: multicast port number */ 

          /* validate the port range */ 
if ((mc_port < MIN_PORT) || (mc_port > MAX_PORT)) { 
    fprintf(stderr, "Invalid port number argument %d.\n", 
     mc_port); 
    fprintf(stderr, "Valid range is between %d and %d.\n", 
     MIN_PORT, MAX_PORT); 
    exit(1); 
} 

/* Load Winsock 2.0 DLL */ 
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) { 
    fprintf(stderr, "WSAStartup() failed"); 
    exit(1); 
} 

/* create socket to join multicast group on */ 
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 
    perror("socket() failed"); 
    exit(1); 
} 

/* set reuse port to on to allow multiple binds per host */ 
if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&flag_on, 
    sizeof(flag_on))) < 0) { 
    perror("setsockopt() failed"); 
    exit(1); 
} 

/* construct a multicast address structure */ 
memset(&mc_addr, 0, sizeof(mc_addr)); 
mc_addr.sin_family = AF_INET; 
mc_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
mc_addr.sin_port = htons(mc_port); 

/* bind to multicast address to socket */ 
if ((bind(sock, (struct sockaddr *) &mc_addr, 
    sizeof(mc_addr))) < 0) { 
    perror("bind() failed"); 
    exit(1); 
} 

/* construct an IGMP join request structure */ 
mc_req.imr_multiaddr.s_addr = inet_addr(mc_addr_str); 
mc_req.imr_interface.s_addr = htonl(INADDR_ANY); 

/* send an ADD MEMBERSHIP message via setsockopt */ 
if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, 
    (char*)&mc_req, sizeof(mc_req))) < 0) { 
    perror("setsockopt() failed"); 
    exit(1); 
} 

for (;;) {   /* loop forever */ 

        /* clear the receive buffers & structs */ 
    memset(recv_str, 0, sizeof(recv_str)); 
    from_len = sizeof(from_addr); 
    memset(&from_addr, 0, from_len); 

    /* block waiting to receive a packet */ 
    if ((recv_len = recvfrom(sock, recv_str, MAX_LEN, 0, 
     (struct sockaddr*)&from_addr, &from_len)) < 0) { 
     perror("recvfrom() failed"); 
     exit(1); 
    } 

    /* output received string */ 
    printf("Received %d bytes from %s: ", recv_len, 
     inet_ntoa(from_addr.sin_addr)); 
    printf("%s", recv_str); 
} 

/* send a DROP MEMBERSHIP message via setsockopt */ 
if ((setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, 
    (void*)&mc_req, sizeof(mc_req))) < 0) { 
    perror("setsockopt() failed"); 
    exit(1); 
} 

closesocket(sock); 
WSACleanup(); /* Cleanup Winsock */ 
0

UDP-сокеты не поддерживают соединения. Невозможно вызвать listen и accept на сокете UDP. Вы можете напрямую читать из UDP-сокета, когда он привязан к локальному порту.

Опция сокета IP_ADD_MEMBERSHIP присоединяет сокет к группе многоадресной передачи.

struct ip_mreq m; 
m.imr_interface.s_addr = inet_addr(loca_ip_address); 
m.imr_multiaddr.s_addr = inet_addr("224.1.50.15"); 
setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&m, sizeof(m)); 

Вы ча найти полный пример на http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancedmulticast9a.html

+0

Можете ли вы сказать мне, как я могу это сделать? Что мне нужно изменить в коде выше, чтобы это сработало? Спасибо! – swartkatt

Смежные вопросы