mirror of
https://bitbucket.org/ohhara/ohmulticastvideoscanner.git
synced 2025-06-29 18:56:15 +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