2010-01-17 7 views
0

http 인 페이로드를 파일에 기록하는 패킷 캡처 코드가 있습니다. 이제이 덤프에서 URL 정보를 추출하고 싶습니다. 각 패킷에 대해 페이로드는 다음과 같이 시작됩니다.C에서 두 개의 하위 문자열 사이에 하위 문자열을 가져 오는 방법은 무엇입니까?

GET /intl/en_com/images/logo_plain.png HTTP/1.1..Host : www.google.co.in..User 에이전트 : 모질라/5.0

I 추출하고 싶습니다 :

  1. "GET"사이의 문자열을 "HTTP/1.1"
  2. 사이 문자열 "호스트"와 "사용자 에이전트"

C에서이 작업을 수행하는 방법은 무엇입니까? inbuilt 문자열 함수가 있습니까? 아니면 정규식?

+0

'strstr()'을 몇 번 호출하면 필요한 모든 것이 가능할 것입니다. 까다로운 부분은 URL에 "HTTP/1.1"이 들어있는 경우를 처리하는 것입니다. 그리고이 문제는 regex lib (C에서 존재하지만 표준 라이브러리에없는 라이브러리)를 사용하더라도 존재합니다. –

+0

좋아, 나는이 모든 것을 시도하고 다시, 당신에게 돌아갈거야, 고마워! – trinity

답변

2

C에는 라이브러리가 있지만 기본 제공 정규 표현식이 없습니다. http://www.arglist.com/regex/, http://www.pcre.org/은 내가 가장 자주 보는 두 가지입니다.

이 작업을 간단하게 수행하면 정규식을 사용하지 않고도 쉽게 벗어날 수 있습니다. 선이 약간의 최대 길이 MAXLEN보다 모두 적게되어 제공, 단지 한 번에 한 라인을 처리 :

char buf[MAXLEN]; 
char url[MAXLEN]; 
char host[MAXLEN]; 
int state = 0;  /* 0: Haven't seen GET yet; 1: haven't seen Host yet */ 
FILE *f = fopen("my_input_file", "rb"); 

if (!f) { 
    report_error_somehow(); 
} 

while (fgets(buf, sizeof buf, f)) { 
    /* Strip trailing \r and \n */ 
    int len = strlen(buf); 
    if (len >= 2 && buf[len - 1] == '\n' && buf[len - 2] == '\r') { 
     buf[len - 2] = 0; 
    } else { 
     if (feof(f)) { 
      /* Last line was not \r\n-terminated: probably OK to ignore */ 
     } else { 
      /* Either the line was too long, or ends with \n but not \r\n. */ 
      report_error_somehow(); 
     } 
    } 

    if (state == 0 && !memcmp(buf, "GET ", 4)) { 
     strcpy(url, buf + 4); /* We know url[] is big enough */ 
     ++state; 
    } else if (state == 1 && !memcmp(buf, "Host: ", 6)) { 
     strcpy(host, buf + 6); /* We know host[] is big enough */ 
     break; 
    } 
} 

fclose(f); 

즉에 의해 미세 비록 (KennyTM의 대답처럼 메모리에 전체 파일을 버퍼링이 필요하지 않습니다이 솔루션 파일이 작다는 것을 안다면 길). 안전하지 않은 gets() 대신에 fgets()을 사용합니다. 긴 행의 버퍼 오버플로가 발생하기 쉽습니다.

+1

POSIX 시스템에서 # 을 포함하고 regcomp(), regexec() 및 regfree()를 사용하면됩니다. – unwind

1

\r의 위치는 strchr (또는 strstr)을 사용하십시오. GETHTTP/1.1Host: 문자열은 고정 길이이므로 문자열 사이의 경로 및 색인을 쉽게 추출 할 수 있습니다.


는 POSIX 호환 시스템에서 정규 표현식을 사용하려면 regcomp(3)있다, 그러나 그것은 또한 사용하기 매우 어렵다.

+0

좋아, 나는이 모든 것을 시도하고 다시, 당신에게 돌아갈거야, 고마워! – trinity

관련 문제