]> git.sur5r.net Git - gsconf/blob - socket.c
A bunch of fixes for various compiler warnings
[gsconf] / socket.c
1 #define _BSD_SOURCE
2
3 #include <arpa/inet.h>
4 #include <sys/socket.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <stdio.h>
9 #include <sys/ioctl.h>
10 #include <netinet/in.h>
11 #include <net/if.h>
12 #include "socket.h"
13 #include <sys/select.h>
14 int sock;
15
16
17 struct sockaddr_in sockAddr;
18
19 unsigned char * get_mac(const char *intf) {
20         unsigned char * mac = (unsigned char *) malloc(sizeof(unsigned char *) * 6);
21         struct ifreq iface;
22         unsigned char i;
23         
24         int tmpSock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
25         
26         
27         //How to get the MAC of the Interface: http://www.geekpage.jp/en/programming/linux-network/get-macaddr.php
28         iface.ifr_addr.sa_family = AF_INET;
29         strncpy(iface.ifr_name, intf, IFNAMSIZ-1);
30         ioctl(tmpSock, SIOCGIFHWADDR, &iface);
31         close(tmpSock);
32         
33         for (i = 0; i < 6; i++)
34                 mac[i] = (unsigned char)iface.ifr_hwaddr.sa_data[i];
35         
36         return mac;
37 }
38
39 void init_socket() {
40         sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
41         
42         if (sock == -1) {
43                 printf("Could not create Socket\n");
44                 exit(1);
45         }
46         
47         
48         
49         memset(&sockAddr, 0, sizeof(sockAddr));
50         sockAddr.sin_family = AF_INET;
51         sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
52         sockAddr.sin_port = htons(63321);
53         
54         if (bind(sock, (struct sockaddr *) &sockAddr, sizeof(sockAddr)) < 0) {
55                 printf("Could not bind to socket\n");
56                 exit(1);
57         }
58         
59         
60 }
61
62
63 int sendBroadcast(char * data, unsigned int len) {
64         
65         int bcp = 1;
66         if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void *) &bcp, sizeof(bcp)) < 0) {
67                 printf("Could not broadcast data\n");
68                 exit(1);
69         }
70         
71         struct sockaddr_in bcAddr;
72         
73         bcAddr.sin_family = AF_INET;
74         bcAddr.sin_addr.s_addr = inet_addr("255.255.255.255");
75         bcAddr.sin_port = htons(63322);
76         
77         return sendto(sock, data, len, 0, (struct sockaddr *) &bcAddr, sizeof(bcAddr));
78         
79           
80 }
81
82 int recvBroadcast(char * data) {
83
84         struct sockaddr sa_in;
85         socklen_t sa_len = sizeof(sa_in);
86         struct  timeval tout;
87         tout.tv_sec = 0;
88         tout.tv_usec = 500000;
89         fd_set fds;
90         FD_ZERO(&fds);
91         FD_SET(sock, &fds);
92         int s = select(sock + 1, &fds, NULL, NULL, &tout);
93         if (s <= 0)
94                 return -1;
95         return recvfrom(sock, data, PACKET_BUFFER, 0, &sa_in, &sa_len);
96         
97 }
98
99
100 int recvBroadcast_tout(char * data) {
101
102         struct sockaddr_in sa_in;
103         socklen_t sa_len = sizeof(sa_in);
104         struct  timeval tout;
105         tout.tv_sec = 5;
106         tout.tv_usec = 0;
107         fd_set fds;
108         FD_ZERO(&fds);
109         FD_SET(sock, &fds);
110         int s = select(sock + 1, &fds, NULL, NULL, &tout);
111         if (s <= 0)
112                 return -1;
113         return recvfrom(sock, data, PACKET_BUFFER, 0,(struct sockaddr * )&sa_in, &sa_len);
114         
115 }
116
117