LinuxでのSocketプログラミングについて教えてください。

・やりたいこと
IPエイリアスで複数アサインしたIPアドレス毎にU)ユニキャストとM)マルチキャストを送受信したい。
・試したこと
1) bind時にIPアドレスを指定(NO-2)
→M)マルチキャストが受信できない
2) UDPの場合はSO_REUSEADDRで同じポートを指定しても良い(NO-4)そうなので指定。
→M)マルチキャストが受信でき、希望通りの動作になった
★U)ユニキャストはNO-3で指定したインターフェースしか受信出来ないのは正しい動作か?

コードの概要は以下の通りです。
#define ETH0_IP "192.168.0.1"
#define ECH00_IP "192.168.0.2"

sock = socket(AF_INET, SOCK_DGRAM, 0);
#ifdef ANY_ADDR
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof opt); // NO-4
#endif
addr.sin_family = AF_INET;
addr.sin_port = htons(3610);
#ifdef ANY_ADDR
addr.sin_addr.s_addr = INADDR_ANY; // NO-1
#else
addr.sin_addr.s_addr = inet_addr(ETH0_IP); // NO-2: eth0
#endif
bind(sock, (struct sockaddr *)&addr, sizeof addr);
mreq.imr_interface.s_addr = inet_addr(ETH0_IP); // NO-3
mreq.imr_multiaddr.s_addr = inet_addr("224.0.23.0");
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof mreq);

recvfrom(sock, buf, sizeof buf, 0, (struct sockaddr *)&from, &addr_len);