socket: avoid unnecessary bind() call
Don't call bind() if the specified local address of a socket has port 0 and the "any" address. It will be bound automatically on connect() or sendmsg().
This commit is contained in:
parent
27fd751915
commit
45e41b7ac1
1 changed files with 14 additions and 1 deletions
15
socket.c
15
socket.c
|
@ -258,6 +258,18 @@ set_ip_options(int sock_fd, int family, int flags)
|
|||
|
||||
/* ================================================== */
|
||||
|
||||
static int
|
||||
is_any_address(IPAddr *addr)
|
||||
{
|
||||
IPAddr any_addr;
|
||||
|
||||
SCK_GetAnyLocalIPAddress(addr->family, &any_addr);
|
||||
|
||||
return UTI_CompareIPs(&any_addr, addr, NULL) == 0;
|
||||
}
|
||||
|
||||
/* ================================================== */
|
||||
|
||||
static int
|
||||
bind_ip_address(int sock_fd, IPSockAddr *addr, int flags)
|
||||
{
|
||||
|
@ -352,8 +364,9 @@ open_ip_socket(IPSockAddr *remote_addr, IPSockAddr *local_addr, int type, int fl
|
|||
if (!set_ip_options(sock_fd, family, flags))
|
||||
goto error;
|
||||
|
||||
/* Bind the socket if a local address was specified */
|
||||
/* Bind the socket if a non-any local address/port was specified */
|
||||
if (local_addr && local_addr->ip_addr.family != IPADDR_UNSPEC &&
|
||||
(local_addr->port != 0 || !is_any_address(&local_addr->ip_addr)) &&
|
||||
!bind_ip_address(sock_fd, local_addr, flags))
|
||||
goto error;
|
||||
|
||||
|
|
Loading…
Reference in a new issue