libcurl 자세한 작업

자세한 작업

좋습니다, 우리는 특정 전송에서 무엇이 잘못되었는지 파악하고 종종 왜 그렇게 할 수 있는지 또는 현재 문제가 무엇인지 설명하기 때문에 사람이 읽을 수 있는 텍스트로 오류를 얻는 방법을 보여주었습니다.

최소한 libcurl 애플리케이션을 개발하거나 libcurl 자체를 디버깅하는 동안 모두가 알아야 하고 광범위하게 사용해야 하는 libcurl 애플리케이션을 작성할 때 다음 생명의 은인은 CURLOPT_VERBOSE를 사용하여 “상세 모드”를 활성화하는 것입니다.

1
CURLcode ret = curl_easy_setopt(handle, CURLOPT_VERBOSE, 1L);

libcurl이 verbose라고 하면 전송이 진행되는 동안 전송 관련 세부 정보 및 정보를 stderr에 언급합니다. 이것은 일이 실패하는 이유를 알아내고 libcurl이 다른 것을 요청할 때 정확히 무엇을 하는지 알아내는 것은 굉장합니다. CURLOPT_STDERR을 사용하여 stderr을 변경하여 출력을 다른 곳으로 리디렉션하거나 디버그 콜백을 사용하여 더 멋진 방식으로 더 많은 정보를 얻을 수 있습니다(나중 섹션에서 자세히 설명).

모든 것을 추적

Verbose는 확실히 괜찮지만 때로는 더 필요합니다. libcurl은 또한 자세한 정보 표시 모드가 수행하는 모든 작업을 표시하는 것 외에도 전송 및 수신된 모든 데이터를 전달하여 애플리케이션이 모든 것을 완벽하게 추적할 수 있도록 추적 콜백을 제공합니다.

추적 콜백으로 전달되고 수신된 데이터는 암호화되지 않은 형식으로 콜백에 제공되며, 이는 디버깅을 위해 네트워크에서 데이터를 캡처하는 것이 실용적이지 않을 때 TLS 또는 SSH 기반 프로토콜로 작업할 때 편리할 수 있습니다.

CURLOPT_DEBUGFUNCTION 옵션을 설정할 때 여전히 CURLOPT_VERBOSE를 활성화해야 하지만 추적 콜백을 설정하면 libcurl은 내부 처리 대신 해당 콜백을 사용합니다.

추적 콜백은 다음과 같은 프로토타입과 일치해야 합니다.

1
2
int my_trace(CURL *handle, curl_infotype type, char *ptr, size_t size,
void *userp);

핸들은 관련된 쉬운 핸들이고, 유형은 콜백에 전달된 특정 데이터(데이터 입/출력, 헤더 입/출력, TLS 데이터 입/출력 및 “텍스트”)를 설명하고, ptr은 크기가 바이트 수인 데이터를 가리킵니다. userp는 CURLOPT_DEBUGDATA로 설정한 사용자 지정 포인터입니다.

ptr이 가리키는 데이터는 0으로 종료되지 않지만 size 인수에 의해 지시된 크기와 정확히 일치합니다.

콜백은 0을 반환해야 하며 그렇지 않으면 libcurl은 이를 오류로 간주하고 전송을 중단합니다.

curl 웹사이트에서 영감을 얻을 수 있는 간단한 추적 기능이 포함된 debug.c라는 예제를 호스팅합니다.

CURLOPT_DEBUGFUNCTION 매뉴얼 페이지에도 추가 세부 정보가 있습니다.

공유하기