mirror of
				https://bitbucket.org/ohhara/ohmulticastvideoscanner.git
				synced 2025-10-31 02:17:13 +00:00 
			
		
		
		
	Add multicast join/leave.
This commit is contained in:
		
							parent
							
								
									2e4d9d1587
								
							
						
					
					
						commit
						314472ff38
					
				
							
								
								
									
										67
									
								
								omvs_main.c
									
									
									
									
									
								
							
							
						
						
									
										67
									
								
								omvs_main.c
									
									
									
									
									
								
							| @ -8,6 +8,7 @@ static gchar *_omvs_output = "omvs_out.txt"; | |||||||
| static gint _omvs_jobs = 1; | static gint _omvs_jobs = 1; | ||||||
| static gint _omvs_sleep = 1000; | static gint _omvs_sleep = 1000; | ||||||
| static gint _omvs_timeout = 10000; | static gint _omvs_timeout = 10000; | ||||||
|  | static gboolean _omvs_verbose; | ||||||
| 
 | 
 | ||||||
| static GOptionEntry _omvs_entries[] = | static GOptionEntry _omvs_entries[] = | ||||||
| { | { | ||||||
| @ -21,6 +22,8 @@ static GOptionEntry _omvs_entries[] = | |||||||
|     "Sleep time(milliseconds) between scans", "ms" }, |     "Sleep time(milliseconds) between scans", "ms" }, | ||||||
|   { "timeout", 't', 0, G_OPTION_ARG_INT, &_omvs_timeout, |   { "timeout", 't', 0, G_OPTION_ARG_INT, &_omvs_timeout, | ||||||
|     "Timeout time(milliseconds) in each scan", "ms" }, |     "Timeout time(milliseconds) in each scan", "ms" }, | ||||||
|  |   { "verbose", 'v', 0, G_OPTION_ARG_NONE, &_omvs_verbose, | ||||||
|  |     "Be verbose", NULL }, | ||||||
|   { NULL } |   { NULL } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -45,14 +48,74 @@ static gpointer _omvs_start_scan_job(gpointer data); | |||||||
| 
 | 
 | ||||||
| static gpointer _omvs_start_scan_job(gpointer data) { | static gpointer _omvs_start_scan_job(gpointer data) { | ||||||
|   OMVSScanner *scanner; |   OMVSScanner *scanner; | ||||||
|  |   GError *error; | ||||||
|  |   GSocket *socket; | ||||||
|  |   GSocketAddress *socket_address; | ||||||
|  |   GInetAddress *inet_address; | ||||||
|   gint i; |   gint i; | ||||||
| 
 | 
 | ||||||
|   scanner = (OMVSScanner *)data; |   scanner = (OMVSScanner *)data; | ||||||
| 
 | 
 | ||||||
|   for (i = 0; i < scanner->num_ipaddrs; i++) { |   socket = g_socket_new(G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, | ||||||
|     g_print("%p %08x\n", (void *)g_thread_self(), scanner->ipaddrs[i].addr); |     G_SOCKET_PROTOCOL_DEFAULT, &error); | ||||||
|  |   if (!socket) { | ||||||
|  |     g_printerr("[%p] can't create socket: %s\n", (void *)g_thread_self(), | ||||||
|  |       error->message); | ||||||
|  |     goto finish_return1; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   inet_address = g_inet_address_new_any(G_SOCKET_FAMILY_IPV4); | ||||||
|  |   socket_address = g_inet_socket_address_new(inet_address, 0xffff); | ||||||
|  |   g_object_unref(inet_address); | ||||||
|  |   if (!g_socket_bind(socket, socket_address, TRUE, &error)) { | ||||||
|  |     g_printerr("[%p] can't bind socket: %s\n", (void *)g_thread_self(), | ||||||
|  |       error->message); | ||||||
|  |     goto finish_return2; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   for (i = 0; i < scanner->num_ipaddrs; i++) { | ||||||
|  |     guint8 addr[4]; | ||||||
|  |     gchar *addr_str; | ||||||
|  |     GInetAddress *group_address; | ||||||
|  | 
 | ||||||
|  |     addr[0] = (guint8)((scanner->ipaddrs[i].addr >> 24) & 0xff); | ||||||
|  |     addr[1] = (guint8)((scanner->ipaddrs[i].addr >> 16) & 0xff); | ||||||
|  |     addr[2] = (guint8)((scanner->ipaddrs[i].addr >> 8) & 0xff); | ||||||
|  |     addr[3] = (guint8)((scanner->ipaddrs[i].addr >> 0) & 0xff); | ||||||
|  | 
 | ||||||
|  |     addr_str = | ||||||
|  |       g_strdup_printf("%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); | ||||||
|  | 
 | ||||||
|  |     if (_omvs_verbose) { | ||||||
|  |       g_print("[%p] start scanning %s\n", (void *)g_thread_self(), addr_str); | ||||||
|  |     } | ||||||
|  |     group_address = g_inet_address_new_from_string(addr_str); | ||||||
|  |     if (!g_socket_join_multicast_group( | ||||||
|  |       socket, group_address, FALSE, _omvs_net_dev, &error)) { | ||||||
|  |       g_printerr("[%p] can't join %s: %s\n", (void *)g_thread_self(), | ||||||
|  |         addr_str, error->message); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     g_usleep(_omvs_timeout * 1000); | ||||||
|  | 
 | ||||||
|  |     if (_omvs_verbose) { | ||||||
|  |       g_print("[%p] finish scanning %s\n", (void *)g_thread_self(), addr_str); | ||||||
|  |     } | ||||||
|  |     if (!g_socket_leave_multicast_group( | ||||||
|  |       socket, group_address, FALSE, _omvs_net_dev, &error)) { | ||||||
|  |       g_printerr("[%p] can't leave %s: %s\n", (void *)g_thread_self(), | ||||||
|  |         addr_str, error->message); | ||||||
|  |     } | ||||||
|  |     g_object_unref(group_address); | ||||||
|  |     g_free(addr_str); | ||||||
|  | 
 | ||||||
|  |     g_usleep(_omvs_sleep * 1000); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | finish_return2: | ||||||
|  |   g_object_unref(socket_address); | ||||||
|  |   g_object_unref(socket); | ||||||
|  | finish_return1: | ||||||
|   return NULL; |   return NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user