@@ -86,12 +86,17 @@ arv_gv_discover_socket_list_new (void)
8686 ArvGvDiscoverSocket * discover_socket = g_new0 (ArvGvDiscoverSocket , 1 );
8787 GSocketAddress * socket_address ;
8888 GSocketAddress * socket_broadcast ;
89+ GSocketAddress * any_socket_address ;
90+ GInetAddress * any_address ;
8991 GInetAddress * inet_address ;
9092 GInetAddress * inet_broadcast ;
9193 char * inet_address_string ;
9294 char * inet_broadcast_string ;
9395 GError * error = NULL ;
9496 gint buffer_size = ARV_GV_INTERFACE_DISCOVERY_SOCKET_BUFFER_SIZE ;
97+ int socket_fd ;
98+ const char * interface_name ;
99+
95100 socket_address = g_socket_address_new_from_native (arv_network_interface_get_addr (iface_iter -> data ),
96101 sizeof (struct sockaddr ));
97102 socket_broadcast = g_socket_address_new_from_native (arv_network_interface_get_broadaddr (iface_iter -> data ),
@@ -112,7 +117,16 @@ arv_gv_discover_socket_list_new (void)
112117 G_SOCKET_TYPE_DATAGRAM ,
113118 G_SOCKET_PROTOCOL_UDP , NULL );
114119 arv_socket_set_recv_buffer_size (g_socket_get_fd (discover_socket -> socket ), buffer_size );
115- g_socket_bind (discover_socket -> socket , discover_socket -> interface_address , FALSE, & error );
120+
121+ any_address = g_inet_address_new_any (G_SOCKET_FAMILY_IPV4 );
122+ any_socket_address = g_inet_socket_address_new (any_address , 0 );
123+ g_socket_bind (discover_socket -> socket , any_socket_address , FALSE, & error );
124+ g_object_unref (any_socket_address );
125+ g_object_unref (any_address );
126+
127+ interface_name = arv_network_interface_get_name (iface_iter -> data );
128+ socket_fd = g_socket_get_fd (discover_socket -> socket );
129+ setsockopt (socket_fd , SOL_SOCKET , SO_BINDTODEVICE , interface_name , strlen (interface_name ));
116130
117131 socket_list -> sockets = g_slist_prepend (socket_list -> sockets , discover_socket );
118132 socket_list -> n_sockets ++ ;
0 commit comments