#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SOCK_PORT 67
int main(int argc, char *argv[])
{
struct hostent *he;
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
int sockfd;
int i;
int addr_len;
int len;
unsigned char buf[1024]={'\0'};
int yes = 1;
if ((he=gethostbyname(argv[1])) == NULL)
{
herror("gethostbyname");
exit(1);
}
/*create a new socket*/
printf ("create socket\n");
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("socket");
exit(1);
}
/*set to broadcast*/
if (setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&yes,sizeof(yes)))
{
perror("setsockopt function!\n");
exit(1);
}
/*set the client Info*/
memset(&c_addr,0,sizeof(struct sockaddr_in));
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(SOCK_PORT+1);
//c_addr.sin_addr.s_addr = INADDR_ANY;
c_addr.sin_addr.s_addr = inet_addr("0.0.0.0");
/*bind address to socket*/
printf ("bind address to socket\n");
if (bind(sockfd, (struct sockaddr *)&c_addr, sizeof(c_addr)) == -1)
{
perror("bind");
exit(1);
}
/*set the server Info*/
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(SOCK_PORT);
s_addr.sin_addr.s_addr = inet_addr("255.255.255.255");
/*send data*/
printf ("send data...\n");
addr_len = sizeof(s_addr);
unsigned char lpbuffer[245]=
{
0x01,0x01,0x06,0x00,0x46,0x1d,0xe9,0xfb,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
0x3f,0x02,0x93,0x59,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x82,0x53,0x63,
0x35,0x01,0x01,0xff,0x00
};
len = sendto(sockfd,lpbuffer,245,0,(struct sockaddr *)&s_addr,addr_len);
if(len<0)
{
perror("sendto");
exit(1);
}
printf("sent %d bytes to %s\n",len,inet_ntoa(s_addr.sin_addr));
sleep (1);
/*get the server Info*/
s_addr.sin_addr = *((struct in_addr *)he->h_addr);
printf ("recv data...\n");
len = recvfrom(sockfd,buf,strlen(buf),0,(struct sockaddr *)&s_addr,&addr_len);
if(len<0)
{
perror("recvfrom");
exit(1);
}
printf ("len: %d\n",len);
for (i=0;i<len;i++)
{
printf ("%02x",buf);
}
printf ("\n");
printf("recv from:%s,%d\n",inet_ntoa(s_addr.sin_addr),ntohs(s_addr.sin_port));
close(sockfd);
return 0;
} |