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