Esempio n. 1
0
/***** 客户端广播 ***********************************************************************************************/
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;
}
Esempio n. 2
0
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);
}