]> git.sur5r.net Git - gsconf/blobdiff - socket.c
Initial Commit
[gsconf] / socket.c
diff --git a/socket.c b/socket.c
new file mode 100644 (file)
index 0000000..b8a46ec
--- /dev/null
+++ b/socket.c
@@ -0,0 +1,115 @@
+#include <arpa/inet.h>
+#include <sys/socket.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <sys/ioctl.h>
+#include <netinet/in.h>
+#include <net/if.h>
+#include "socket.h"
+#include <sys/select.h>
+int sock;
+
+
+struct sockaddr_in sockAddr;
+
+unsigned char * get_mac(const char *intf) {
+        unsigned char * mac = (unsigned char *) malloc(sizeof(unsigned char *) * 6);
+        struct ifreq iface;
+        unsigned char i;
+        
+        int tmpSock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
+        
+        
+        //How to get the MAC of the Interface: http://www.geekpage.jp/en/programming/linux-network/get-macaddr.php
+        iface.ifr_addr.sa_family = AF_INET;
+        strncpy(iface.ifr_name, intf, IFNAMSIZ-1);
+        ioctl(tmpSock, SIOCGIFHWADDR, &iface);
+        close(tmpSock);
+        
+        for (i = 0; i < 6; i++)
+                mac[i] = (unsigned char)iface.ifr_hwaddr.sa_data[i];
+        
+        return mac;
+}
+
+void init_socket() {
+        sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
+        
+        if (sock == -1) {
+                printf("Could not create Socket\n");
+                exit(1);
+        }
+        
+        
+        
+        memset(&sockAddr, 0, sizeof(sockAddr));
+        sockAddr.sin_family = AF_INET;
+        sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
+        sockAddr.sin_port = htons(63321);
+        
+        if (bind(sock, (struct sockaddr *) &sockAddr, sizeof(sockAddr)) < 0) {
+                printf("Could not bind to socket\n");
+                exit(1);
+        }
+        
+        
+}
+
+
+int sendBroadcast(char * data, unsigned int len) {
+        
+        int bcp = 1;
+        if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void *) &bcp, sizeof(bcp)) < 0) {
+                printf("Could not broadcast data\n");
+                exit(1);
+        }
+        
+        struct sockaddr_in bcAddr;
+        
+        bcAddr.sin_family = AF_INET;
+        bcAddr.sin_addr.s_addr = inet_addr("255.255.255.255");
+        bcAddr.sin_port = htons(63322);
+        
+        return sendto(sock, data, len, 0, (struct sockaddr *) &bcAddr, sizeof(bcAddr));
+        
+          
+}
+
+int recvBroadcast(char * data) {
+
+        struct sockaddr_in sa_in;
+        int sa_len = sizeof(sa_in);
+        struct         timeval tout;
+        tout.tv_sec = 0;
+        tout.tv_usec = 500000;
+        fd_set fds;
+        FD_ZERO(&fds);
+        FD_SET(sock, &fds);
+        int s = select(sock + 1, &fds, NULL, NULL, &tout);
+        if (s <= 0)
+                return -1;
+        return recvfrom(sock, data, PACKET_BUFFER, 0,(struct sockaddr * )&sa_in, &sa_len);
+        
+}
+
+
+int recvBroadcast_tout(char * data) {
+
+        struct sockaddr_in sa_in;
+        int sa_len = sizeof(sa_in);
+        struct         timeval tout;
+        tout.tv_sec = 5;
+        tout.tv_usec = 0;
+        fd_set fds;
+        FD_ZERO(&fds);
+        FD_SET(sock, &fds);
+        int s = select(sock + 1, &fds, NULL, NULL, &tout);
+        if (s <= 0)
+                return -1;
+        return recvfrom(sock, data, PACKET_BUFFER, 0,(struct sockaddr * )&sa_in, &sa_len);
+        
+}
+
+