2013-02-17 5 views
2

recv 사용하기 HTTP 헤더를 가져와 콘텐츠 길이를 파싱 할 수 있습니다. 그러나 줄 바꿈을 감지하는 데 문제가 있습니다. 아니면 실제로 줄 바꿈을 감지해야합니까? 아니면 처음 버퍼를 읽을 때 항상 전체 헤더가 될까요 (충분히 긴 버퍼가 있다고 가정). 나는에 대한 걱정 것들 중 하나가 입니다 관련된 몇 가지 질문을보고 "...은"헤더 휴식의 \ 연구 \ n을 "수 있습니다 : r n r n을 사용하여 http 헤더의 끝을 감지합니다.

편집

은 C로 작성되어 recv()에 대한 두 가지 다른 호출을 통해 버퍼로 끌어 들여 코드가 헤더 틈을 인식하지 못하게합니다. " (이 x 바이트로도 쓸 수있는 CB 및 감소)

+0

시간 초과로 다시 읽지 않으려면 "\ r \ n \ r \ n"을 확인하십시오. 모든 콘텐츠를 한 번에 읽을 수는 없습니다. –

+0

바로 내가 이것을하고 정규식을 사용하여 줄 바꿈을 찾았지만, 실제로 액세스 권한이 부여 된 라이브러리에는 포함되어 있지 않습니다. – Julian

+0

문자열의 마지막 4자를 "\ r \ n \ r \ n"과 비교하고 일치하는지 확인하는 데 필요한 정규식이 필요하지 않습니다. –

답변

4

반복적) RECV를 (호출 할 때마다 그것은 당신이 x 바이트로 그에게 줄 버퍼 포인터를 증가 당신에게 x 바이트를 제공합니다. 버퍼에 \r\n\r\n이 포함되거나 완전 찼을 때까지이 작업을 수행합니다.이 경우 소켓을 닫고 그때부터 악의적 인 클라이언트를 무시하면됩니다. 버퍼 크기는 약 3000 바이트 여야합니다.

: 이것은 서버가 폴링 서버 인 것으로 보이는 일반적인 문제를 무시합니다. 경험이 있다면 epoll 서버를 만들어야합니다.

+0

epoll에 대한 조언이있을 때까지 +1 할 예정이었습니다.epoll은 비표준이며, 이식성이 없으며, 장기간 지속되는 몇 개의 연결이나 과도기적 인 연결이 아니라 수천 개의 긴 수명 연결을 처리하지 않는 한 이식 가능한 설문 조사보다 훨씬 느립니다. 이미 epoll을 사용하는 것을 고려하지 않아야합니다. 측정이 이미 해결할 수있는 성능 문제가 없다면 말입니다. –

+0

'epoll-server'는 일반적으로 비동기를 의미합니다. 모든 주요 운영체제는 현재 이와 유사한 것을 가지고 있습니다. 폴링을 사용하면 많은 서비스 거부가 가능합니다. epoll/async가 방법입니다. –

+0

좋아,이 대화가 어렵다는 용어를 충분히 섞어 놓은 것처럼 들리니, 말하기에 충분하다. OP가 일을보다 분명하게 설명 할 누군가의 말을 들어야한다고 생각하면 충분하다. ... –

0

패킷 경계를 넘어서 "\ r \ n \ r \ n"을 식별하는 문제 외에 패킷 경계를 넘어서 "Content-Length : xxxx \ r \ n"을 식별하는 문제가 있습니다. 한 번에 한 바이트 씩받는 것과 파싱하는 것이 좋습니다. '\ r'의 recv() 뒤에 '\ n'의 recv(), '\ r'의 recv(), '\ n'의 recv 헤더가 끝났는지 확인하십시오. 이것을 파악하고 나면 n 바이트를 초기에 1로 정의 된 전 처리기 정의 인 시간에 n 바이트를 수신하고 파싱하도록 솔루션을 수정하고 n을 변경합니다. 헤더가 발견되면

while (recv... > 0) { 
    if rnrn is inside the buffer using strstr 
     look for content length, output error if content length doesn't exist 
    else 
     keep on reading into the buffer 
} 

후 나는 메시지 본문에 대한 읽기 계속 : 결국

0

나는 이런 일을했다.

어쨌든 고맙습니다. 내 대답을 얻으려면 실제로 비효율적 인 방법으로 일을 끝내지 만 수행해야 할 작업은 완료되었습니다.

+0

그래서 ** 거의 ** 내가 첫 단락에서 제안한 바가 있습니다. 내 대답을 받아 들일 수 있니? 또한 : 당신은 정말로 ** strstr **을 사용하여 \ r \ n \ r \ n을 찾지 않아야합니다. 왜냐하면 (악의적 인) 클라이언트가 \ r \ n \ r을 보내지 않으면 버퍼의 끝에서 실행되기 때문입니다. \ n. –

+0

통제 된 환경, 어떤 코드 작품이든 작동합니다. 나는 당신의 대답을 받아 들였습니다. – Julian

관련 문제