00001 #include <netdb.h>
00002 #include <sys/types.h>
00003 #include <sys/socket.h>
00004 #include <netinet/in.h>
00005 #include <sys/ioctl.h>
00006 #include <errno.h>
00007 #include <stdio.h>
00008 #include <time.h>
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 void wait_for_ms(int ms)
00019 {
00020 double sec = (double)ms / 1000;
00021 sec *= CLOCKS_PER_SEC;
00022 clock_t wait = clock() + sec;
00023 while(clock() < wait){}
00024 return;
00025 }
00026
00027 main(int argc, char *argv[])
00028 {
00029 if (argc != 5)
00030 {
00031 printf("Parametry: -ip_adresa/hostname port protokol(zadejte udp) konfiguracni_soubor");
00032 return;
00033 }
00034 struct sockaddr_in my_addr, rem_addr;
00035 int sockfd;
00036 struct hostent *ph;
00037 struct servent *ps;
00038 struct protoent *pp;
00039 unsigned int inaddr;
00040
00041 int i,iii, len, rem_addr_length;
00042 char s[80];
00043 char *p;
00044 char sbuf[80], rbuf[80];
00045 FILE * input;
00046 FILE * config;
00047
00048 if ((inaddr=inet_addr(argv[1]))!=INADDR_NONE)
00049 ph=gethostbyaddr((char *)&inaddr, sizeof(unsigned int), AF_INET);
00050 else
00051 ph=gethostbyname(argv[1]);
00052
00053 if (ph)
00054 {
00055 printf("\nHostname: %s\n",ph->h_name);
00056 for (i=0; ph->h_aliases[i]; i++)
00057 printf(" %s\n", ph->h_aliases[i]);
00058
00059 printf("Type: %i\nLen: %i\n", ph->h_addrtype, ph->h_length);
00060 for (i=0; ph->h_addr_list[i]; i++)
00061 printf("Addr: %i.%i.%i.%i\n",
00062 (unsigned char)(ph->h_addr_list[i])[0],
00063 (unsigned char)(ph->h_addr_list[i])[1],
00064 (unsigned char)(ph->h_addr_list[i])[2],
00065 (unsigned char)(ph->h_addr_list[i])[3]);
00066 }
00067 else
00068 {
00069 herror("Chyba pri zjisteni adresy - neni registrovano ve jmenne sluzbe");
00070 exit(10);
00071 }
00072
00073
00074
00075
00076 if (isdigit(argv[3][0]))
00077 pp=getprotobynumber(atoi(argv[3]));
00078 else
00079 pp=getprotobyname(argv[3]);
00080
00081 if (pp)
00082 {
00083 printf("\nProtocol: %s\n", pp->p_name);
00084 for (i=0; pp->p_aliases[i]; i++)
00085 printf(" %s\n", pp->p_aliases[i]);
00086 printf("Num: %i\n", pp->p_proto);
00087 }
00088 else
00089 {
00090 printf("Chyba pri zjisteni protokulu\n");
00091 exit(11);
00092 }
00093
00094
00095
00096
00097 if (isdigit(argv[2][0]))
00098 ps=getservbyport(htons((u_short)atoi(argv[2])), pp->p_name);
00099 else
00100 ps=getservbyname(argv[2], pp->p_name);
00101
00102 if (ps)
00103 {
00104 printf("\nServname: %s\n",ps->s_name);
00105 for (i=0; ps->s_aliases[i]; i++)
00106 printf(" %s\n", ps->s_aliases[i]);
00107
00108 printf("Port: %hi\nProto: %s\n", ntohs((u_short)ps->s_port), ps->s_proto);
00109 }
00110 else
00111 {
00112 if (isdigit(argv[2][0])&&((u_short)atoi(argv[2]) > 1024))
00113 printf("Cislo portu vetsi nez 1024\n");
00114 else
00115 {
00116 printf("Chyba pri zjisteni sluzby\n");
00117 exit(12);
00118 }
00119 }
00120
00121
00122
00123
00124
00125 printf("\n");
00126
00127 if ((sockfd = socket(PF_INET, SOCK_DGRAM, pp->p_proto))<0)
00128 {
00129 perror("Socket nelze otevrit");
00130 exit(1);
00131 }
00132
00133 bzero((char *) &my_addr, sizeof(my_addr));
00134 my_addr.sin_family = AF_INET;
00135 my_addr.sin_addr.s_addr = INADDR_ANY;
00136 my_addr.sin_port = 0;
00137 if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(my_addr)) < 0)
00138 {
00139 perror("Chyba v bind");
00140 close(sockfd); exit(2);
00141 }
00142
00143 bzero ((char *) &rem_addr, sizeof(rem_addr));
00144 rem_addr.sin_family = AF_INET;
00145 if (isdigit(argv[2][0])&&((u_short)atoi(argv[2]) > 1024))
00146 rem_addr.sin_port = htons((u_short)atoi(argv[2]));
00147 else
00148 rem_addr.sin_port = ps->s_port;
00149 bcopy(ph->h_addr, (char *) &rem_addr.sin_addr, ph->h_length);
00150 char packet[9000];
00151 char chunk;
00152
00153
00154
00155
00156 config = fopen(argv[4], "r");
00157 if (config == 0) {printf("config nejde otevrit\n"); return 0 ;}
00158 else printf("soubor otevren \n");
00159 char filename[256];
00160 int aa;
00161 while(1)
00162 {
00163 if ( 2 != fscanf(config, "%s %i", &filename, &aa)) return 0;
00164 printf("%s %i", filename, aa);
00165 iii = 0;
00166 input = fopen(filename, "r");
00167 if (input == 0) printf("nefunguje");
00168 while (iii < aa)
00169 {
00170 chunk = getc(input);
00171 packet[iii] = chunk;
00172 iii++;
00173 printf("%c",chunk);
00174 }
00175 fclose(input);
00176
00177 strcpy(sbuf,argv[4]);
00178 len = strlen(sbuf);
00179 printf("Odesilana zprava(%i): %s\n", len, sbuf);
00180
00181 if ((len = sendto(sockfd, packet, iii, 0, (struct sockaddr *) &rem_addr, sizeof(rem_addr))) < 0)
00182 {
00183 perror("Chyba ve vysilani");
00184 close(sockfd); exit(3);
00185 }
00186 printf("Odeslano %i\n", len);
00187 wait_for_ms(50);
00188 }
00189 close(sockfd);
00190 }
00191