mirror of
https://bitbucket.org/ohhara/ohmulticastvideoscanner.git
synced 2025-06-12 02:16:20 +00:00
Add multicast ip address parser.
This commit is contained in:
parent
e2927aac55
commit
bee33bf997
2
Makefile
2
Makefile
@ -7,7 +7,7 @@ OBJS = \
|
||||
CC = gcc
|
||||
LD = gcc
|
||||
RM = rm -rf
|
||||
PKGS = gstreamer-1.0
|
||||
PKGS = gstreamer-1.0 gio-2.0
|
||||
CFLAGS = -I. `pkg-config --cflags $(PKGS)` `pcap-config --cflags`
|
||||
CFLAGS += -std=gnu99 -W -Wall -Wno-unused-result -pedantic
|
||||
CFLAGS += -DOMVS_VERSION=\"$(OMVS_VERSION)\"
|
||||
|
89
omvs_main.c
89
omvs_main.c
@ -1,4 +1,6 @@
|
||||
#include <string.h>
|
||||
#include <pcap.h>
|
||||
#include <gio/gio.h>
|
||||
#include <gst/gst.h>
|
||||
|
||||
static gchar *_omvs_net_dev;
|
||||
@ -36,14 +38,26 @@ typedef struct _OMVSIPAddr {
|
||||
typedef struct _OMVSScanner {
|
||||
OMVSIPAddr *ipaddrs;
|
||||
gint num_ipaddrs;
|
||||
gint scan_ipaddr_idx;
|
||||
gint scan_port_idx;
|
||||
} OMVSScanner;
|
||||
|
||||
static gint _omvs_start_scan(OMVSScanner *scanner);
|
||||
|
||||
static gint _omvs_start_scan(OMVSScanner *scanner) {
|
||||
gint i;
|
||||
for (i = 0; i < scanner->num_ipaddrs; i++) {
|
||||
g_print("%08x\n", scanner->ipaddrs[i].addr);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
GError *error = NULL;
|
||||
GOptionContext *context;
|
||||
int ret = 0;
|
||||
gint i;
|
||||
gint num_ipaddrs;
|
||||
gint idx_ipaddr;
|
||||
OMVSScanner omvs_scanner;
|
||||
|
||||
context = g_option_context_new("<multicast ip address or net ... [#N]>");
|
||||
g_option_context_set_summary(context,
|
||||
@ -70,6 +84,77 @@ int main(int argc, char *argv[]) {
|
||||
goto finish_return;
|
||||
}
|
||||
|
||||
num_ipaddrs = 0;
|
||||
for (i = 1; i < argc; i++) {
|
||||
GInetAddressMask *mask;
|
||||
GInetAddress *addr;
|
||||
guint len;
|
||||
mask = g_inet_address_mask_new_from_string(argv[i], &error);
|
||||
if (!mask) {
|
||||
g_print("%s parsing failed: %s\n", argv[i], error->message);
|
||||
ret = -3;
|
||||
goto finish_return;
|
||||
}
|
||||
if (g_inet_address_mask_get_family(mask) != G_SOCKET_FAMILY_IPV4) {
|
||||
g_print("%s is not ipv4 ip address\n", argv[i]);
|
||||
g_object_unref(mask);
|
||||
ret = -4;
|
||||
goto finish_return;
|
||||
}
|
||||
addr = g_inet_address_mask_get_address(mask);
|
||||
if (!g_inet_address_get_is_multicast(addr)) {
|
||||
g_print("%s is not multicast ip address\n", argv[i]);
|
||||
g_object_unref(mask);
|
||||
ret = -4;
|
||||
goto finish_return;
|
||||
}
|
||||
len = g_inet_address_mask_get_length(mask);
|
||||
if (len) {
|
||||
num_ipaddrs += (1 << (32 - len));
|
||||
} else {
|
||||
num_ipaddrs++;
|
||||
}
|
||||
g_object_unref(mask);
|
||||
}
|
||||
|
||||
memset(&omvs_scanner, 0, sizeof(OMVSScanner));
|
||||
omvs_scanner.ipaddrs = g_malloc0(num_ipaddrs * sizeof(OMVSIPAddr));
|
||||
omvs_scanner.num_ipaddrs = num_ipaddrs;
|
||||
|
||||
idx_ipaddr = 0;
|
||||
for (i = 1; i < argc; i++) {
|
||||
GInetAddressMask *mask;
|
||||
GInetAddress *addr;
|
||||
guint len;
|
||||
guint32 start_ipaddr;
|
||||
const guint8 *addr_bytes;
|
||||
mask = g_inet_address_mask_new_from_string(argv[i], &error);
|
||||
addr = g_inet_address_mask_get_address(mask);
|
||||
len = g_inet_address_mask_get_length(mask);
|
||||
addr_bytes = g_inet_address_to_bytes(addr);
|
||||
start_ipaddr =
|
||||
(((guint32)addr_bytes[0]) << 24) |
|
||||
(((guint32)addr_bytes[1]) << 16) |
|
||||
(((guint32)addr_bytes[2]) << 8) |
|
||||
(((guint32)addr_bytes[3]) << 0);
|
||||
if (len) {
|
||||
guint n;
|
||||
guint j;
|
||||
n = (1 << (32 - len));
|
||||
for (j = 0; j < n; j++) {
|
||||
omvs_scanner.ipaddrs[idx_ipaddr].addr = start_ipaddr;
|
||||
idx_ipaddr++;
|
||||
start_ipaddr++;
|
||||
}
|
||||
} else {
|
||||
omvs_scanner.ipaddrs[idx_ipaddr].addr = start_ipaddr;
|
||||
idx_ipaddr++;
|
||||
}
|
||||
}
|
||||
|
||||
_omvs_start_scan(&omvs_scanner);
|
||||
g_free(omvs_scanner.ipaddrs);
|
||||
|
||||
finish_return:
|
||||
g_option_context_free(context);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user