2016-12-21 43 views
0

주소가 udp://@224.1.50.15:1234 인 멀티 캐스트 MPEG 스트림 그룹에 어떻게 참여할 수 있습니까? 내가 관리하고 싶은 것은 단지 스트림 서버와 연결하여 서버가 내가이 멀티 캐스트 그룹에 흥미가 있다는 사실을 알게하여 서버가 일정 시간 동안 스트림 패킷을 보내도록하는 것이다.C++ 멀티 캐스트 MPEG 스트림에 어떻게 참여할 수 있습니까?

예 : VLC Player로 그룹에 연결할 때까지이 멀티 캐스트 그룹에서 패킷을받지 못합니다. VLC 플레이어를 닫은 후에도 짧은 기간 동안 그룹의 패킷을 계속 수신합니다. 내가 뭘 하려는지 VLC 플레이어 또는 다른 제 3 자 응용 프로그램의 도움없이 패킷을받을 것입니다.

위의 목적을 위해이 그룹과 어떻게 연결해야합니까? 심지어 가능하다면?

P .: 네트워크 인터페이스가 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.lib''에서'libvlc_media_new_location' 기능을 사용하기로 결정. 제 의견으로는 과대 평가입니다. – swartkatt

답변

0

확인에서 전체 예제를 찾을 CA, 내가 Multicast Sockets Practical Guide for Programmers which is written by David Makofske & Kevin Almeroth

감사의 책의 도움으로 내 문제를 해결하기 위해 관리 노력에 대한 작가와 Zaboj Campula로 이동 .

나는이 게시물과 답변이 앞으로 많은 다른 사람들에게 도움이되기를 바랍니다. 작업 코드가 아래에 작성되었습니다! 누군가가 내 주제에 대한 답을 쓸 것까지 비주얼 스튜디오 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 소켓은 연결을 지원하지 않습니다. UDP 소켓에서 listenaccept으로 전화를 걸 수 없습니다. 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