1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

For #988, refine code.

This commit is contained in:
winlin 2017-10-14 12:09:53 +08:00
parent 823dc2df21
commit 922a8f3a5c
11 changed files with 104 additions and 122 deletions

View file

@ -34,6 +34,7 @@
#include <netdb.h>
using namespace std;
#include <srs_core_autofree.hpp>
#include <srs_kernel_log.hpp>
#include <srs_kernel_error.hpp>
#include <srs_app_server.hpp>
@ -112,31 +113,31 @@ srs_error_t SrsUdpListener::listen()
{
srs_error_t err = srs_success;
char port_string[8];
snprintf(port_string, sizeof(port_string), "%d", port);
char sport[8];
snprintf(sport, sizeof(sport), "%d", port);
addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_NUMERICHOST;
addrinfo* result = NULL;
if(getaddrinfo(ip.c_str(), port_string, (const addrinfo*)&hints, &result) != 0) {
return srs_error_new(ERROR_SYSTEM_IP_INVALID, "bad address");
addrinfo* r = NULL;
SrsAutoFree(addrinfo, r);
if(getaddrinfo(ip.c_str(), sport, (const addrinfo*)&hints, &r) != 0) {
return srs_error_new(ERROR_SYSTEM_IP_INVALID, "get address info");
}
if ((_fd = socket(result->ai_family, result->ai_socktype, result->ai_protocol)) == -1) {
freeaddrinfo(result);
return srs_error_new(ERROR_SOCKET_CREATE, "create linux socket error. ip=%s, port=%d", ip.c_str(), port);
if ((_fd = socket(r->ai_family, r->ai_socktype, r->ai_protocol)) == -1) {
return srs_error_new(ERROR_SOCKET_CREATE, "create socket. ip=%s, port=%d", ip.c_str(), port);
}
srs_fd_close_exec(_fd);
srs_socket_reuse_addr(_fd);
if (bind(_fd, result->ai_addr, result->ai_addrlen) == -1) {
freeaddrinfo(result);
return srs_error_new(ERROR_SOCKET_BIND, "bind socket error. ep=%s:%d", ip.c_str(), port);;
if (bind(_fd, r->ai_addr, r->ai_addrlen) == -1) {
return srs_error_new(ERROR_SOCKET_BIND, "bind socket. ep=%s:%d", ip.c_str(), port);;
}
freeaddrinfo(result);
if ((_stfd = srs_netfd_open_socket(_fd)) == NULL){
return srs_error_new(ERROR_ST_OPEN_SOCKET, "st open socket");
@ -208,31 +209,31 @@ srs_error_t SrsTcpListener::listen()
{
srs_error_t err = srs_success;
char port_string[8];
snprintf(port_string, sizeof(port_string), "%d", port);
char sport[8];
snprintf(sport, sizeof(sport), "%d", port);
addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_NUMERICHOST;
addrinfo* result = NULL;
if(getaddrinfo(ip.c_str(), port_string, (const addrinfo*)&hints, &result) != 0) {
return srs_error_new(ERROR_SYSTEM_IP_INVALID, "bad address");
addrinfo* r = NULL;
SrsAutoFree(addrinfo, r);
if(getaddrinfo(ip.c_str(), sport, (const addrinfo*)&hints, &r) != 0) {
return srs_error_new(ERROR_SYSTEM_IP_INVALID, "get address info");
}
if ((_fd = socket(result->ai_family, result->ai_socktype, result->ai_protocol)) == -1) {
freeaddrinfo(result);
return srs_error_new(ERROR_SOCKET_CREATE, "create linux socket error. ip=%s, port=%d", ip.c_str(), port);
if ((_fd = socket(r->ai_family, r->ai_socktype, r->ai_protocol)) == -1) {
return srs_error_new(ERROR_SOCKET_CREATE, "create socket. ip=%s, port=%d", ip.c_str(), port);
}
srs_fd_close_exec(_fd);
srs_socket_reuse_addr(_fd);
if (bind(_fd, result->ai_addr, result->ai_addrlen) == -1) {
freeaddrinfo(result);
return srs_error_new(ERROR_SOCKET_BIND, "bind socket error. ep=%s:%d", ip.c_str(), port);;
if (bind(_fd, r->ai_addr, r->ai_addrlen) == -1) {
return srs_error_new(ERROR_SOCKET_BIND, "bind socket. ep=%s:%d", ip.c_str(), port);;
}
freeaddrinfo(result);
if (::listen(_fd, SERVER_LISTEN_BACKLOG) == -1) {
return srs_error_new(ERROR_SOCKET_LISTEN, "listen socket");

View file

@ -54,7 +54,7 @@ SrsRtpConn::SrsRtpConn(SrsRtspConn* r, int p, int sid)
_port = p;
stream_id = sid;
// TODO: support listen at <[ip:]port>
listener = new SrsUdpListener(this, (srs_check_ipv6() ? "::" : "0.0.0.0"), p);
listener = new SrsUdpListener(this, srs_any_address4listener(), p);
cache = new SrsRtpPacket();
pprint = SrsPithyPrint::create_caster();
}

View file

@ -1137,7 +1137,7 @@ srs_error_t SrsServer::listen_stream_caster()
}
// TODO: support listen at <[ip:]port>
if ((err = listener->listen( (srs_check_ipv6() ? "::" : "0.0.0.0"), port)) != srs_success) {
if ((err = listener->listen(srs_any_address4listener(), port)) != srs_success) {
return srs_error_wrap(err, "listen at %d", port);
}
}

View file

@ -1104,16 +1104,6 @@ void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps)
}
}
int srs_check_ipv6()
{
int sd = socket(AF_INET6, SOCK_DGRAM, 0);
if(sd >= 0) {
close(sd);
return 1;
}
return 0;
}
string srs_get_local_ip(int fd)
{
// discovery client information
@ -1122,19 +1112,16 @@ string srs_get_local_ip(int fd)
if (getsockname(fd, (sockaddr*)&addr, &addrlen) == -1) {
return "";
}
srs_verbose("get local ip success.");
char address_string[64];
const int success = getnameinfo((const sockaddr*)&addr, addrlen,
(char*)&address_string, sizeof(address_string),
NULL, 0,
NI_NUMERICHOST);
if(success != 0) {
char saddr[64];
char* h = (char*)saddr;
socklen_t nbh = (socklen_t)sizeof(saddr);
const int r0 = getnameinfo((const sockaddr*)&addr, addrlen, h, nbh,NULL, 0, NI_NUMERICHOST);
if(r0 != 0) {
return "";
}
srs_verbose("get local ip of client ip=%s, fd=%d", address_string, fd);
return std::string(address_string);
return std::string(saddr);
}
int srs_get_local_port(int fd)
@ -1145,7 +1132,6 @@ int srs_get_local_port(int fd)
if (getsockname(fd, (sockaddr*)&addr, &addrlen) == -1) {
return 0;
}
srs_verbose("get local ip success.");
int port = 0;
switch(addr.ss_family) {
@ -1157,7 +1143,6 @@ int srs_get_local_port(int fd)
break;
}
srs_verbose("get local port of client port=%s, fd=%d", port, fd);
return port;
}
@ -1169,19 +1154,16 @@ string srs_get_peer_ip(int fd)
if (getsockname(fd, (sockaddr*)&addr, &addrlen) == -1) {
return "";
}
srs_verbose("get peer ip success.");
char address_string[64];
const int success = getnameinfo((const sockaddr*)&addr, addrlen,
(char*)&address_string, sizeof(address_string),
NULL, 0,
NI_NUMERICHOST);
if(success != 0) {
char saddr[64];
char* h = (char*)saddr;
socklen_t nbh = (socklen_t)sizeof(saddr);
const int r0 = getnameinfo((const sockaddr*)&addr, addrlen, h, nbh, NULL, 0, NI_NUMERICHOST);
if(r0 != 0) {
return "";
}
srs_verbose("get peer ip of client ip=%s, fd=%d", address_string, fd);
return std::string(address_string);
return std::string(saddr);
}
bool srs_is_digit_number(const string& str)

View file

@ -643,9 +643,6 @@ extern SrsNetworkRtmpServer* srs_get_network_rtmp_server();
// the deamon st-thread will update it.
extern void srs_update_rtmp_server(int nb_conn, SrsKbps* kbps);
// check for IPv6 support
extern int srs_check_ipv6();
// get local or peer ip.
// where local ip is the server ip which client connected.
extern std::string srs_get_local_ip(int fd);