rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stdlib.h>
|
nuclear@0
|
3 #include <string.h>
|
nuclear@0
|
4 #include <unistd.h>
|
nuclear@0
|
5 #include <sys/types.h>
|
nuclear@0
|
6 #include <sys/socket.h>
|
nuclear@0
|
7 #include <arpa/inet.h>
|
nuclear@0
|
8 #include <sys/time.h>
|
nuclear@0
|
9 #include <sys/select.h>
|
nuclear@0
|
10
|
nuclear@0
|
11 #define MAGIC 0x6d0f
|
nuclear@0
|
12 #define DISCOVER 1
|
nuclear@0
|
13 #define DREPLY 2
|
nuclear@0
|
14
|
nuclear@0
|
15 struct message {
|
nuclear@0
|
16 int magic;
|
nuclear@0
|
17 int type;
|
nuclear@0
|
18 char data[24];
|
nuclear@0
|
19 };
|
nuclear@0
|
20
|
nuclear@0
|
21 int discover(struct sockaddr_in *client_sa);
|
nuclear@0
|
22
|
nuclear@0
|
23 int opt_dport = 0x6d0f; /* discover broadcast port */
|
nuclear@0
|
24 unsigned int opt_timeout = 5000; /* 10 sec discovery timeout */
|
nuclear@0
|
25
|
nuclear@0
|
26 int main(int argc, char **argv)
|
nuclear@0
|
27 {
|
nuclear@0
|
28 }
|
nuclear@0
|
29
|
nuclear@0
|
30 int discover(struct sockaddr_in *client_sa)
|
nuclear@0
|
31 {
|
nuclear@0
|
32 int s, true = 1;
|
nuclear@0
|
33 struct sockaddr_in sa;
|
nuclear@0
|
34 unsigned int timeout = opt_timeout;
|
nuclear@0
|
35 struct message msg;
|
nuclear@0
|
36 struct timeval tv, tv_timeout;
|
nuclear@0
|
37
|
nuclear@0
|
38 if((s = socket(PF_INET, SOCK_DGRAM, 0)) == -1) {
|
nuclear@0
|
39 perror("failed to create discover datagram socket");
|
nuclear@0
|
40 return -1;
|
nuclear@0
|
41 }
|
nuclear@0
|
42 setsockopt(s, SOL_SOCKET, SO_BROADCAST, &true, sizeof true);
|
nuclear@0
|
43
|
nuclear@0
|
44 memset(&sa, 0, sizeof sa);
|
nuclear@0
|
45 sa.sin_family = AF_INET;
|
nuclear@0
|
46 sa.sin_port = htons(opt_dport);
|
nuclear@0
|
47 sa.sin_addr.s_addr = htonl(INADDR_ANY);
|
nuclear@0
|
48
|
nuclear@0
|
49 if(bind(s, (struct sockaddr*)&sa, sizeof sa) == -1) {
|
nuclear@0
|
50 perror("failed to bind datagram socket");
|
nuclear@0
|
51 close(s);
|
nuclear@0
|
52 return -1;
|
nuclear@0
|
53 }
|
nuclear@0
|
54
|
nuclear@0
|
55 do {
|
nuclear@0
|
56 msg.magic = MAGIC;
|
nuclear@0
|
57 msg.type = DISCOVER;
|
nuclear@0
|
58
|
nuclear@0
|
59 memset(&sa, 0, sizeof sa);
|
nuclear@0
|
60 sa.sin_family = AF_INET;
|
nuclear@0
|
61 sa.sin_port = htons(opt_dport);
|
nuclear@0
|
62 sa.sin_addr.s_addr = 0xffffffff;
|
nuclear@0
|
63
|
nuclear@0
|
64 if(sendto(s, &msg, sizeof msg, 0, (struct sockaddr*)&sa, sizeof sa) == -1) {
|
nuclear@0
|
65 perror("failed to send discovery bcast dgram");
|
nuclear@0
|
66 close(s);
|
nuclear@0
|
67 return -1;
|
nuclear@0
|
68 }
|
nuclear@0
|
69 } while(0);
|
nuclear@0
|
70
|
nuclear@0
|
71 close(s);
|
nuclear@0
|
72 return 0;
|
nuclear@0
|
73 }
|