mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
IPv6 support (for 3.0 release) (#988)
* IPv6 support, part 1. * IPv6 support, part 2. * Some more IPv6 work. * Made functions for address:port paŕsing IPv6-capable. * Fixed type (compile warning). * Fixed formatting. * Reverted option change. * Replaced abort() by proper error handling. * Also retrieving local IPv6 addresses now.
This commit is contained in:
parent
db08f1586c
commit
feaae341b9
20 changed files with 296 additions and 201 deletions
|
@ -64,6 +64,8 @@
|
|||
|
||||
#include <sys/types.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#include <srs_kernel_utility.hpp>
|
||||
#include <srs_kernel_consts.hpp>
|
||||
|
@ -73,6 +75,7 @@
|
|||
struct SrsBlockSyncSocket
|
||||
{
|
||||
SOCKET fd;
|
||||
int family;
|
||||
int64_t rbytes;
|
||||
int64_t sbytes;
|
||||
// The send/recv timeout in ms.
|
||||
|
@ -105,27 +108,40 @@ void srs_hijack_io_destroy(srs_hijack_io_t ctx)
|
|||
int srs_hijack_io_create_socket(srs_hijack_io_t ctx, srs_rtmp_t owner)
|
||||
{
|
||||
SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx;
|
||||
|
||||
skt->fd = ::socket(AF_INET, SOCK_STREAM, 0);
|
||||
|
||||
skt->family = AF_INET6;
|
||||
skt->fd = ::socket(skt->family, SOCK_STREAM, 0); // Try IPv6 first.
|
||||
if (!SOCKET_VALID(skt->fd)) {
|
||||
skt->family = AF_INET;
|
||||
skt->fd = ::socket(skt->family, SOCK_STREAM, 0); // Try IPv4 instead, if IPv6 fails.
|
||||
}
|
||||
if (!SOCKET_VALID(skt->fd)) {
|
||||
return ERROR_SOCKET_CREATE;
|
||||
}
|
||||
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
int srs_hijack_io_connect(srs_hijack_io_t ctx, const char* server_ip, int port)
|
||||
{
|
||||
SrsBlockSyncSocket* skt = (SrsBlockSyncSocket*)ctx;
|
||||
|
||||
sockaddr_in addr;
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons(port);
|
||||
addr.sin_addr.s_addr = inet_addr(server_ip);
|
||||
|
||||
if(::connect(skt->fd, (const struct sockaddr*)&addr, sizeof(sockaddr_in)) < 0){
|
||||
return ERROR_SOCKET_CONNECT;
|
||||
|
||||
char port_string[8];
|
||||
snprintf(port_string, sizeof(port_string), "%d", port);
|
||||
addrinfo hints;
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = skt->family;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_flags = AI_NUMERICHOST;
|
||||
addrinfo* result = NULL;
|
||||
|
||||
if(getaddrinfo(server_ip, port_string, (const addrinfo*)&hints, &result) == 0) {
|
||||
if(::connect(skt->fd, result->ai_addr, result->ai_addrlen) < 0){
|
||||
freeaddrinfo(result);
|
||||
return ERROR_SOCKET_CONNECT;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
freeaddrinfo(result);
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
int srs_hijack_io_read(srs_hijack_io_t ctx, void* buf, size_t size, ssize_t* nread)
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <srs_librtmp.hpp>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
// for srs-librtmp, @see https://github.com/ossrs/srs/issues/213
|
||||
#ifndef _WIN32
|
||||
|
@ -340,16 +341,12 @@ static char *inet_ntop6(const u_char *src, char *dst, socklen_t size);
|
|||
const char* inet_ntop(int af, const void *src, char *dst, socklen_t size)
|
||||
{
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
return (inet_ntop4( (unsigned char*)src, (char*)dst, size)); // ****
|
||||
#ifdef AF_INET6
|
||||
#error "IPv6 not supported"
|
||||
//case AF_INET6:
|
||||
// return (char*)(inet_ntop6( (unsigned char*)src, (char*)dst, size)); // ****
|
||||
#endif
|
||||
default:
|
||||
// return (NULL); // ****
|
||||
return 0 ; // ****
|
||||
case AF_INET:
|
||||
return (inet_ntop4( (unsigned char*)src, (char*)dst, size));
|
||||
case AF_INET6:
|
||||
return (char*)(inet_ntop6( (unsigned char*)src, (char*)dst, size));
|
||||
default:
|
||||
return (NULL);
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
@ -498,7 +495,8 @@ int srs_librtmp_context_resolve_host(Context* context)
|
|||
int ret = ERROR_SUCCESS;
|
||||
|
||||
// connect to server:port
|
||||
context->ip = srs_dns_resolve(context->host);
|
||||
int family = AF_UNSPEC;
|
||||
context->ip = srs_dns_resolve(context->host, family);
|
||||
if (context->ip.empty()) {
|
||||
return ERROR_SYSTEM_DNS_RESOLVE;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue