nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: nuclear@0: #define MAGIC 0x6d0f nuclear@0: #define DISCOVER 1 nuclear@0: #define DREPLY 2 nuclear@0: nuclear@0: struct message { nuclear@0: int magic; nuclear@0: int type; nuclear@0: char data[24]; nuclear@0: }; nuclear@0: nuclear@0: int discover(struct sockaddr_in *client_sa); nuclear@0: nuclear@0: int opt_dport = 0x6d0f; /* discover broadcast port */ nuclear@0: unsigned int opt_timeout = 5000; /* 10 sec discovery timeout */ nuclear@0: nuclear@0: int main(int argc, char **argv) nuclear@0: { nuclear@0: } nuclear@0: nuclear@0: int discover(struct sockaddr_in *client_sa) nuclear@0: { nuclear@0: int s, true = 1; nuclear@0: struct sockaddr_in sa; nuclear@0: unsigned int timeout = opt_timeout; nuclear@0: struct message msg; nuclear@0: struct timeval tv, tv_timeout; nuclear@0: nuclear@0: if((s = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { nuclear@0: perror("failed to create discover datagram socket"); nuclear@0: return -1; nuclear@0: } nuclear@0: setsockopt(s, SOL_SOCKET, SO_BROADCAST, &true, sizeof true); nuclear@0: nuclear@0: memset(&sa, 0, sizeof sa); nuclear@0: sa.sin_family = AF_INET; nuclear@0: sa.sin_port = htons(opt_dport); nuclear@0: sa.sin_addr.s_addr = htonl(INADDR_ANY); nuclear@0: nuclear@0: if(bind(s, (struct sockaddr*)&sa, sizeof sa) == -1) { nuclear@0: perror("failed to bind datagram socket"); nuclear@0: close(s); nuclear@0: return -1; nuclear@0: } nuclear@0: nuclear@0: do { nuclear@0: msg.magic = MAGIC; nuclear@0: msg.type = DISCOVER; nuclear@0: nuclear@0: memset(&sa, 0, sizeof sa); nuclear@0: sa.sin_family = AF_INET; nuclear@0: sa.sin_port = htons(opt_dport); nuclear@0: sa.sin_addr.s_addr = 0xffffffff; nuclear@0: nuclear@0: if(sendto(s, &msg, sizeof msg, 0, (struct sockaddr*)&sa, sizeof sa) == -1) { nuclear@0: perror("failed to send discovery bcast dgram"); nuclear@0: close(s); nuclear@0: return -1; nuclear@0: } nuclear@0: } while(0); nuclear@0: nuclear@0: close(s); nuclear@0: return 0; nuclear@0: }