I’m trying to simulate the behavior of a DNS server, which I have a DB named hosts.txt containing machine_names/IP_addresses, for example:
equipo_00/169.0.1.169
sala_oeste_01/200.1.2.200
sala_oeste_02/200.2.3.200
sala_oeste_03/200.3.4.200
MEMFIS_04/201.4.5.201
ICARO_05/200.5.6.200
equipo_06/169.6.7.169
sala_este_07/201.7.8.201
sala_este_08/201.8.9.201
CEC_09/189.9.10.189
Here’s my code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char** argv)
{
char* machine, *ip_add;
FILE* db;
char* flag;
char tmp[256];
char par[256];
printf("> ");
scanf("%s", par);
db = fopen("hosts.txt", "r");
while(db != NULL && fgets(tmp, sizeof(tmp), db) != NULL)
{
if(strstr(tmp, par))
{
flag = "1"; // flag setting to 1 means find the line
machine = strtok(tmp, "/");//here's supposed to get the value of the machine
ip_add = strtok(NULL, "/");//here's supposed to get the value of the ip adress
}
}//while
if(strcmp(flag, "1") == 0) //
{
printf("here\n");
}
else
{
flag = "0"; //flag setting to 0
printf("there\n");
}
printf("flag= %s pc=%s server=%s\n", flag, machine, ip_add);
return 0;
}
My code reads from standard input, the value of the machine and indicate the IP address that is assigned to that machine on the server. The problem is that the program is not normal behavior, I do not know how to modify my code to an expected output, eg
input: equipo_00
output: flag = 1 pc = equipo_00 server=169.0.1.169
Sorry if the question is rather silly, I’m new to this language .. thank you all for your help and excuse my English
This is what you do:
Read a string from the file into
tmp.Check if user entered string
paris present intmp.If yes you go ahead and tokenize
tmpon/and make the pointermachinepoint to the first piece andip_addpoint to the next piece.Note that
machineandip_addare just pointers. And they point at various indices oftmp. So later when you continue with the loop you read the new string again intotmp, overwriting it. This causes the problem and your pointer are now pointing to a changed string.To avoid this just add a break after a successful match:
Also your final
printf:should be part of your
ifbody, so that you print them only if you’ve found the match.Currently you are printing even if a match is not found. In which case you’ll be printing junk as your pointers
serverandip_addhave not been initialized.