Kernel Bug Tracker – Bug 43249
connect(2) changes INADDR_ANY meaning for UDP sockets
Last modified: 2012-05-14 22:28:33 UTC
Created attachment 73297 [details]
Testcase which demonstrates the bug scenario
The POSIX man page for connect(2)  specifies that:
> If the socket has not already been bound to a local address, connect()
> shall bind it to an address which, unless the socket's address family
> is AF_UNIX, is an unused local address.
The Linux man page for connect(2) does not provide this information, and this may be confusing, regarding the following behaviour:
After creating a socket of type SOCK_DGRAM through socket(2), and calling bind(2) on it to have it "listen" on all interfaces (through the use of INADDR_ANY as value of sockaddr_in.sin_addr.s_addr), it is possible to call connect(2) on said socket. This behaviour is correctly explained by the connect(2) Linux man page :
> If the socket sockfd is of type SOCK_DGRAM then addr is the address to
> which datagrams are sent by default, and the only address from which data‐
> grams are received.
However, upon doing so, the socket is no longer "bound" to any interface (as could be assumed through the usage of INADDR_ANY), but one in particular (and it is apparently not possible to know which one, before calling connect(2)). This seems to contradict the information provided by the ip(7) man page :
> When a process wants to receive new incoming packets or connections, it
> should bind a socket to a local interface address using bind(2). Only
> one IP socket may be bound to any given local (address, port) pair. When
> INADDR_ANY is specified in the bind call, the socket will be bound to
> all local interfaces.
I have attached a test-case which demonstrates this apparently conflicting behaviour.
I would suggest adding a paragraph or comment that would explain this subtlety, as it can cause difficult to diagnose issues when using connected UDP sockets.