/***** 客户端广播 ***********************************************************************************************/ int ClientBroadcast(void) { int ret = -1; int sock = -1; char buf[20]; fd_set readfd; struct timeval timeout; struct sockaddr_in broadcast_addr; //本地地址 struct sockaddr_in from_addr; //客户端地址 int len = sizeof(struct sockaddr_in); //socket sock = socket(AF_INET, SOCK_DGRAM, 0); if(0 > sock) { perror("client socket err"); return -1; } //get broadcast addr if( GetBroadcastAddr(sock, &broadcast_addr) ) { printf("get broadcast addr failed!\n"); goto _out; } //set broadcast if( SetBroadcast(sock, &broadcast_addr) ) { printf("set broadcast failed!\n"); goto _out; } while(1) { //send ret = sendto(sock, IP_FOUND, strlen(IP_FOUND) + 1, 0, (struct sockaddr *)&broadcast_addr, len); if(0 > ret) { perror("server send err"); goto _out; } //文件描述符集合清零 FD_ZERO(&readfd); //将套接字文件描述符加入读集合 FD_SET(sock, &readfd); //超时时间 timeout.tv_sec = 5; //秒 timeout.tv_usec = 0; //微秒 //监听套接字sock是否有数据可读,超时为5秒 ret = select(sock+1, &readfd, NULL, NULL, &timeout); switch(ret) { case -1: printf("select error!\n"); goto _out; case 0: printf("time out!\n"); break; default: { //sock套接口有数据可读 if( FD_ISSET(sock, &readfd) ) { //recieve ret = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&from_addr, &len); if(0 > ret) { perror("server recieve err"); goto _out; } printf("buf : %s\n", buf); //如果与IP_FOUND吻合 if( strstr(buf, IP_FOUND_ACK) ) { printf("IP is %s\n", inet_ntoa(from_addr.sin_addr)); } } } } } //close close(sock); return 0; _out: close(sock); return -1; }
int GetIfStatus(int sk,char *vifdev,char *vaddress,char *vnetmask,char *vbroadcast) { struct sockaddr_in *sin; struct sockaddr_in netmask; int insane = false; struct hostent *hp; struct in_addr inaddr; Verbose("Checking interface status...\n"); if ((hp = gethostbyname(VSYSNAME.nodename)) == NULL) { CfLog(cferror,"","gethostbyname"); return false; } else { memcpy(&inaddr,hp->h_addr,hp->h_length); Verbose("Address given by nameserver: %s\n",inet_ntoa(inaddr)); } strcpy(IFR.ifr_name,vifdev); if (ioctl(sk,SIOCGIFADDR, (caddr_t) &IFR) == -1) /* Get the device status flags */ { return false; } sin = (struct sockaddr_in *) &IFR.ifr_addr; if (strlen(vaddress) > 0) { if (strcmp(vaddress,(char *)inet_ntoa(sin->sin_addr)) != 0) { CfLog(cferror,"This machine is configured with an address which differs from\n",""); CfLog(cferror,"the cfagent configuration\n",""); CfLog(cferror,"Don't know what to do yet...\n",""); insane = true; } } if (strcmp((char *)inet_ntoa(*(struct in_addr *)(hp->h_addr)),(char *)inet_ntoa(sin->sin_addr)) != 0) { CfLog(cferror,"This machine is configured with an address which differs from\n",""); CfLog(cferror,"the nameserver's information! (Insane!)\n",""); CfLog(cferror,"Don't quite know what to do...\n",""); insane = true; } if (ioctl(sk,SIOCGIFNETMASK, (caddr_t) &IFR) == -1) { return false; } netmask.sin_addr = ((struct sockaddr_in *) &IFR.ifr_addr)->sin_addr; Verbose("Found netmask: %s\n",inet_ntoa(netmask.sin_addr)); strcpy(VBUFF,inet_ntoa(netmask.sin_addr)); if (strcmp(VBUFF,vnetmask)) { CfLog(cferror,"The netmask is incorrectly configured, resetting...\n",""); insane = true; } if (ioctl(sk,SIOCGIFBRDADDR, (caddr_t) &IFR) == -1) { return false; } sin = (struct sockaddr_in *) &IFR.ifr_addr; strcpy(VBUFF,inet_ntoa(sin->sin_addr)); Verbose("Found broadcast address: %s\n",inet_ntoa(sin->sin_addr)); GetBroadcastAddr(inet_ntoa(inaddr),vifdev,vnetmask,vbroadcast); if (strcmp(VBUFF,VNUMBROADCAST) != 0) { snprintf(OUTPUT,CF_BUFSIZE*2,"Broadcast address was %s not %s (should be bit-type %s)\n",VBUFF,VNUMBROADCAST,vbroadcast); CfLog(cferror,OUTPUT,""); insane = true; } return(insane); }