Skip to content

Commit

Permalink
fallback to IPv4 if IPv6 fails
Browse files Browse the repository at this point in the history
  • Loading branch information
albertz committed Apr 15, 2011
1 parent 532a468 commit fdf3938
Showing 1 changed file with 33 additions and 20 deletions.
53 changes: 33 additions & 20 deletions hairtunes.c
Expand Up @@ -411,37 +411,50 @@ void rtp_request_resend(seq_t first, seq_t last) {


int init_rtp(void) {
#ifdef AF_INET6
struct sockaddr_in6 si;
int type = AF_INET6;
unsigned short *sin_port = &si.sin6_port;
#else
struct sockaddr_in si;
int type = AF_INET;
short *sin_port = &si.sin_port;
struct sockaddr* si_p = (struct sockaddr*)&si;
socklen_t si_len = sizeof(si);
unsigned short *sin_port = &si.sin_port;
memset(&si, 0, sizeof(si));
#ifdef AF_INET6
struct sockaddr_in6 si6;
type = AF_INET6;
si_p = (struct sockaddr*)&si6;
si_len = sizeof(si6);
sin_port = &si6.sin6_port;
memset(&si6, 0, sizeof(si6));
#endif
int sock = -1, csock = -1; // data and control (we treat the streams the same here)

memset(&si, 0, sizeof(si));
si.sin_family = AF_INET;
#ifdef SIN_LEN
si.sin_len = sizeof(si);
#endif
si.sin_addr.s_addr = htonl(INADDR_ANY);
#ifdef AF_INET6
si.sin6_family = AF_INET6;
si6.sin6_family = AF_INET6;
#ifdef SIN6_LEN
si.sin6_len = sizeof(si);
#endif
si.sin6_addr = in6addr_any;
si.sin6_flowinfo = 0;
#else
si.sin_family = AF_INET;
#ifdef SIN_LEN
si.sin_len = sizeof(si);
si6.sin6_len = sizeof(si);
#endif
si.sin_addr.s_addr = htonl(INADDR_ANY);
si6.sin6_addr = in6addr_any;
si6.sin6_flowinfo = 0;
#endif

int sock = -1, csock = -1; // data and control (we treat the streams the same here)
unsigned short port = 6000;
while(1) {
if(sock < 0)
sock = socket(type, SOCK_DGRAM, IPPROTO_UDP);
#ifdef AF_INET6
if(sock==-1 && type == AF_INET6) {
// try fallback to IPv4
type = AF_INET;
si_p = (struct sockaddr*)&si;
si_len = sizeof(si);
sin_port = &si.sin_port;
continue;
}
#endif
if (sock==-1)
die("Can't create data socket!");

Expand All @@ -451,9 +464,9 @@ int init_rtp(void) {
die("Can't create control socket!");

*sin_port = htons(port);
int bind1 = bind(sock, (struct sockaddr*)&si, sizeof(si));
int bind1 = bind(sock, si_p, si_len);
*sin_port = htons(port + 1);
int bind2 = bind(csock, (struct sockaddr*)&si, sizeof(si));
int bind2 = bind(csock, si_p, si_len);

if(bind1 != -1 && bind2 != -1) break;
if(bind1 != -1) { close(sock); sock = -1; }
Expand Down

0 comments on commit fdf3938

Please sign in to comment.