#include <vlc_network.h>
-#ifdef WIN32
-# if defined(UNDER_CE)
-# undef IP_MULTICAST_TTL
-# define IP_MULTICAST_TTL 3
-# undef IP_ADD_MEMBERSHIP
-# define IP_ADD_MEMBERSHIP 5
-# endif
+#ifdef _WIN32
+# undef EAFNOSUPPORT
# define EAFNOSUPPORT WSAEAFNOSUPPORT
#else
# include <unistd.h>
int i_protocol );
/* */
-static int net_SetupDgramSocket( vlc_object_t *p_obj, int fd, const struct addrinfo *ptr )
+static int net_SetupDgramSocket (vlc_object_t *p_obj, int fd,
+ const struct addrinfo *ptr)
{
#ifdef SO_REUSEPORT
setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, &(int){ 1 }, sizeof (int));
#endif
-#ifdef SO_RCVBUF
- /* Increase the receive buffer size to 1/2MB (8Mb/s during 1/2s)
- * to avoid packet loss caused in case of scheduling hiccups */
- setsockopt (fd, SOL_SOCKET, SO_RCVBUF,
- (void *)&(int){ 0x80000 }, sizeof (int));
- setsockopt (fd, SOL_SOCKET, SO_SNDBUF,
- (void *)&(int){ 0x80000 }, sizeof (int));
-#endif
-
-#if defined (WIN32) || defined (UNDER_CE)
+#if defined (_WIN32)
if (net_SockAddrIsMulticast (ptr->ai_addr, ptr->ai_addrlen)
&& (sizeof (struct sockaddr_storage) >= ptr->ai_addrlen))
{
#endif
if (bind (fd, ptr->ai_addr, ptr->ai_addrlen))
{
- msg_Err( p_obj, "socket bind error (%m)" );
+ msg_Err( p_obj, "socket bind error: %s", vlc_strerror_c(net_errno) );
net_Close (fd);
return -1;
}
static int net_ListenSingle (vlc_object_t *obj, const char *host, int port,
int protocol)
{
- struct addrinfo hints, *res;
-
- memset (&hints, 0, sizeof( hints ));
- hints.ai_socktype = SOCK_DGRAM;
- hints.ai_protocol = protocol;
- hints.ai_flags = AI_PASSIVE;
+ struct addrinfo hints = {
+ .ai_socktype = SOCK_DGRAM,
+ .ai_protocol = protocol,
+ .ai_flags = AI_PASSIVE | AI_NUMERICSERV | AI_IDN,
+ }, *res;
if (host && !*host)
host = NULL;
ptr->ai_protocol);
if (fd == -1)
{
- msg_Dbg (obj, "socket error: %m");
+ msg_Dbg (obj, "socket error: %s", vlc_strerror_c(net_errno));
continue;
}
default:
errno = EAFNOSUPPORT;
- msg_Warn( p_this, "%m" );
+ msg_Warn( p_this, "%s", vlc_strerror_c(EAFNOSUPPORT) );
return VLC_EGENERIC;
}
/* BSD compatibility */
unsigned char buf;
- msg_Dbg( p_this, "cannot set hop limit (%d): %m", hlim );
+ msg_Dbg( p_this, "cannot set hop limit (%d): %s", hlim,
+ vlc_strerror_c(net_errno) );
buf = (unsigned char)(( hlim > 255 ) ? 255 : hlim);
if( setsockopt( fd, proto, cmd, &buf, sizeof( buf ) ) )
{
- msg_Err( p_this, "cannot set hop limit (%d): %m", hlim );
+ msg_Err( p_this, "cannot set hop limit (%d): %s", hlim,
+ vlc_strerror_c(net_errno) );
return VLC_EGENERIC;
}
}
if (setsockopt (fd, SOL_IPV6, IPV6_MULTICAST_IF,
&scope, sizeof (scope)) == 0)
return 0;
+ break;
#endif
#ifdef __linux__
if (setsockopt (fd, SOL_IP, IP_MULTICAST_IF,
&req, sizeof (req)) == 0)
return 0;
+ break;
}
#endif
default:
errno = EAFNOSUPPORT;
}
- msg_Err (p_this, "cannot force multicast interface %s: %m", iface);
+ msg_Err (p_this, "cannot force multicast interface %s: %s", iface,
+ vlc_strerror_c(errno));
return -1;
}
}
#endif
- msg_Err (obj, "cannot join source multicast group: %m");
+ msg_Err (obj, "cannot join source multicast group: %s",
+ vlc_strerror_c(net_errno));
msg_Warn (obj, "trying ASM instead of SSM...");
return net_Subscribe (obj, fd, grp, grplen);
}
}
#endif
- msg_Err (obj, "cannot join multicast group: %m");
+ msg_Err (obj, "cannot join multicast group: %s",
+ vlc_strerror_c(net_errno));
return -1;
}
int net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port,
int i_hlim, int proto )
{
- struct addrinfo hints, *res, *ptr;
+ struct addrinfo hints = {
+ .ai_socktype = SOCK_DGRAM,
+ .ai_protocol = proto,
+ .ai_flags = AI_NUMERICSERV | AI_IDN,
+ }, *res;
int i_handle = -1;
bool b_unreach = false;
if( i_hlim < 0 )
i_hlim = var_InheritInteger( p_this, "ttl" );
- memset( &hints, 0, sizeof( hints ) );
- hints.ai_socktype = SOCK_DGRAM;
- hints.ai_protocol = proto;
-
msg_Dbg( p_this, "net: connecting to [%s]:%d", psz_host, i_port );
int val = vlc_getaddrinfo (psz_host, i_port, &hints, &res);
return -1;
}
- for( ptr = res; ptr != NULL; ptr = ptr->ai_next )
+ for (struct addrinfo *ptr = res; ptr != NULL; ptr = ptr->ai_next)
{
char *str;
int fd = net_Socket (p_this, ptr->ai_family, ptr->ai_socktype,
if (fd == -1)
continue;
- /* Increase the receive buffer size to 1/2MB (8Mb/s during 1/2s)
- * to avoid packet loss caused by scheduling problems */
- setsockopt (fd, SOL_SOCKET, SO_RCVBUF, &(int){ 0x80000 }, sizeof (int));
- setsockopt (fd, SOL_SOCKET, SO_SNDBUF, &(int){ 0x80000 }, sizeof (int));
-
/* Allow broadcast sending */
setsockopt (fd, SOL_SOCKET, SO_BROADCAST, &(int){ 1 }, sizeof (int));
break;
}
-#if defined( WIN32 ) || defined( UNDER_CE )
+#if defined( _WIN32 )
if( WSAGetLastError () == WSAENETUNREACH )
#else
if( errno == ENETUNREACH )
#endif
b_unreach = true;
else
- {
- msg_Warn( p_this, "%s port %d : %m", psz_host, i_port);
- net_Close( fd );
- continue;
- }
+ msg_Warn( p_this, "%s port %d : %s", psz_host, i_port,
+ vlc_strerror_c(errno) );
+ net_Close( fd );
}
freeaddrinfo( res );
msg_Dbg (obj, "net: connecting to [%s]:%d from [%s]:%d",
psz_server, i_server, psz_bind, i_bind);
- struct addrinfo hints, *loc, *rem;
-
- memset (&hints, 0, sizeof (hints));
- hints.ai_socktype = SOCK_DGRAM;
- hints.ai_protocol = protocol;
+ struct addrinfo hints = {
+ .ai_socktype = SOCK_DGRAM,
+ .ai_protocol = protocol,
+ .ai_flags = AI_NUMERICSERV | AI_IDN,
+ }, *loc, *rem;
int val = vlc_getaddrinfo (psz_server, i_server, &hints, &rem);
if (val)
return -1;
}
- hints.ai_flags = AI_PASSIVE;
+ hints.ai_flags |= AI_PASSIVE;
val = vlc_getaddrinfo (psz_bind, i_bind, &hints, &loc);
if (val)
{
ptr->ai_addr, ptr->ai_addrlen)
: connect (fd, ptr2->ai_addr, ptr2->ai_addrlen))
{
- msg_Err (obj, "cannot connect to %s port %d: %m",
- psz_server, i_server);
+ msg_Err (obj, "cannot connect to %s port %d: %s",
+ psz_server, i_server, vlc_strerror_c(net_errno));
continue;
}
val = fd;