2015-01-30 11 views
0

IP 주소를 통해 하나의 수식을 적용하고 있습니다. 그러나 때때로 나에게 무작위적인 결과를 주는데, 그것은 우연히 일어난다. 때로는 올바르게 토큰 화되지 않고 때로는 0 값을 부여합니다. 오류 재연의 비율은 1000 샘플에서 거의 2-5입니다.
호출 함수 = 수식 (IPADDRESS); 내가 초당 수백 개의 다른 IP를 사용하고있다. 문자열이 올바르게 토큰 화되지 않았습니다.

int formula (char ip[]){ 

      char *token = NULL; 
      unsigned long value; 
      int finalv; 
      char ipaddress[16]; 
      char delims[]=".";   
      int octet=3; 
      value = 0; 
      FILE *fp; 
      fp = fopen(LOGFILE, "a"); 
      strcpy(ipaddress,ip); 
      fprintf(fp, "%s\n",ipaddress); 
      token = strtok(ipaddress,delims); 

      while(token != NULL) { 
       fprintf(fp,"%d",(atoi(token)); 
       if (atoi(token) != 0){ 
        if(octet ==3) 
          value = value + (255 * 255 * 255 * (atoi(token))); 
        else if(octet ==2) 
          value = value + (255 * 255 * (atoi(token))); 
        else if(octet ==1) 
          value = value + (255 * (atoi(token))); 
        else if(octet ==0) 
          value = value + (atoi(token)); 
       } 
        octet--; 
       token = strtok(NULL,delims); 
      } 

      finalv = value % 9999; 

      fprintf(fp, " -- %d \n",(int)finalv); 
      if(fp) 
        fclose(fp); 
      return (int)v; 
    } 

OUTPUTFILE

: 는

172.17.82.255 
172 0 1 -- 1983 
-- 
172.254.254.254 
172 0 0 0 -- 1728 
-- 
172.255.255.225 
172 0 -- 1728 
-- 
172.255.255.255 
172 21 0 1 -- 7390 
-- 
172.255.84.255 
172 0 8 -- 3768 
+0

토큰 = strtok (NULL, 토큰)'은 이전 토큰을 구분 기호로 사용하여'ipaddress'에서 다음 토큰을 찾습니다. 의도적이라고 생각하지 않습니다. – DevSolar

+0

죄송합니다. 잘못된 코드를 붙여 넣습니다. 여기에 업데이트 된 코드가 있습니다. 여전히 오류가 발생합니다. –

+2

왜 255의 힘을 곱하고 있습니까? ??? 다음 바이트 위치는 가중치 256에 해당합니다. – CiaPan

답변

0

strtok()을 반복하는 대신

int a=0, b=0, c=0, d=0 ; 
int value ; 
sscanf(ip, "%d.%d.%d.%d", &a, &b, &c, &d); 
value = ((a * 255 + b) * 255 + c) * 255 + d ; 
finalv = value % 9999 

나는 같은 대답을해야한다고 생각합니다. (비록 코멘트에서 지적한 바와 같이, 255256을 의미 할 수 있음).

+2

256 ...? – CiaPan

+0

나는 누군가가 제대로 읽었는지를 확인하고 있다고 주장 할 수있다 :-) – TripeHound

+0

'255'는 OP가 사용하고있는 것인데 ... 틀렸거나 (9999로 modding하고 있기 때문에) 어떤 종류의 해시 함수가 될까요? – TripeHound

2

당신은 token를 재 선언하고 (난 단지 잘못된 출력을 감안할 때 한) : 나중에 코드에서

 char *token = NULL; // <-- here 
     unsigned long value; 
     int finalv; 
     char ipaddress[16]; 
     char token[]="."; // <-- and here 

, 다음, 당신은 약간의 혼동에 대한이 어떤 문맥에서 token이 사용되는 것으로 가정합니다. 여기서 특히 명백합니다 :

... 여기서 첫 번째 토큰은 아마도 포인터와 두 번째 배열을 의미합니다.

컴파일 된 것조차 마음에 들지만, 컴파일러가 적어도 그것에 대해 경고하지는 않는지 조금 놀랍습니다.

EDIT : token는 정의되지 않은 동작에 이르게하는 NULL 때 "업데이트"코드에서

fp = fopen(LOGFILE, token); 

가 실행된다. 당신은

fp = fopen(LOGFILE, "w"); 

을 의미 했습니까?

+0

Nice, 재 선언을 포착하지 않았습니다. 그것은 dodgy 두 번째'strtok()'호출을 설명합니다. – DevSolar

+0

죄송합니다. 잘못된 코드를 붙여 넣습니다. 여기에 업데이트 된 코드가 있습니다. 여전히 동일한 오류가 발생합니다. –

0

변화

token = strtok(NULL,token);

token = strtok(NULL,".");

PS에 : 초당 번이 기능 수백를 호출하기 때문에, 당신은 더 나은 개방 거라고 및 기능

외부 파일을 닫습니다
+0

죄송합니다. 잘못된 코드를 붙여 넣습니다. 여기에 오류가 발생하는 업데이트 된 코드가 있습니다. 나는 함수 밖에서 파일을 열고 닫을 것이다. –

+0

왜이 트릭을 사용하지 않는 것이 좋을까요? @ user95711 http://stackoverflow.com/questions/27915245/incompatible-types-when-a-function-returns-a-union –