curl_easy_recv(3)
π curl_easy_recv β bestie's guide to raw socket reads
okay so this is from the Library Functions Manual (yeah, the libcurl one π«Ά) and it's literally the page for curl_easy_recv(3). Sit down, grab a strawberry drink π, we're learning to read raw bytes off an "easy" connection.
β¨ NAME β¨
curl_easy_recv β receives raw data on an "easy" connection π
β¨ SYNOPSIS β¨
#include <curl/curl.h>
CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen, size_t *n);
πΈ DESCRIPTION πΈ
So this function receives raw data from the established connection. That's it, that's the vibe. You can pair it with curl_easy_send(3) to implement custom protocols using libcurl β like, your own protocol, your own rules, main character energy π₯.
This is particularly useful if you use proxies and/or SSL encryption, because libcurl takes care of proxy negotiation and connection setup for you. You don't have to do the boring parts. Iconic. π
- buffer is a pointer to your buffer memory that gets populated by the received data.
- buflen is the maximum amount of data you can get in that buffer.
- The variable n points to receives the number of received bytes.
To establish the connection, set CURLOPT_CONNECT_ONLY(3) option before calling curl_easy_perform(3) or curl_multi_perform(3).
β οΈ Note that curl_easy_recv(3) does not work on connections that were created without this option. No option, no bytes. Periodt.
The call returns CURLE_AGAIN if there is no data to read β the socket is used in non-blocking mode internally. When CURLE_AGAIN is returned, use your operating system facilities like select(2) to wait for data. The socket may be obtained using curl_easy_getinfo(3) with CURLINFO_ACTIVESOCKET(3).
π Wait on the socket only ifcurl_easy_recv(3)returnsCURLE_AGAIN. The reason for this is libcurl or the SSL library may internally cache some data, therefore you should callcurl_easy_recv(3)until all data is read which would include any cached data.
Furthermore if you wait on the socket and it tells you there is data to read, curl_easy_recv(3) may return CURLE_AGAIN if the only data that was read was for internal SSL processing, and no other data is available. Yeah. It's giving "read the room" π the library is doing secret SSL stuff behind your back.
π PROTOCOLS π
This functionality affects all supported protocols β¨
π EXAMPLE π
int main(void)
{
CURL *curl = curl_easy_init();
if(curl) {
CURLcode result;
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
/* Do not do the transfer - only connect to host */
curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
result = curl_easy_perform(curl);
if(result == CURLE_OK) {
char buf[256];
size_t nread;
curl_socket_t sockfd;
/* Extract the socket from the curl handle - we need it for waiting. */
result = curl_easy_getinfo(curl, CURLINFO_ACTIVESOCKET, &sockfd);
/* read data */
result = curl_easy_recv(curl, buf, sizeof(buf), &nread);
}
}
}
Look at that little guy go π¦ connect only, grab the socket, read the data.
β AVAILABILITY β
Added in curl 7.18.2 β vintage but still slaying.
π RETURN VALUE π
- On success, returns
CURLE_OK, stores the received data into buffer, and the number of bytes it actually read into*n. π - On failure, returns the appropriate error code. π
- The function may return
CURLE_AGAIN. In this case, use your operating system facilities to wait until data can be read, and retry. π - Reading exactly 0 bytes indicates a closed connection. Bye bestie π
- If there is no socket available to use from the previous transfer, this function returns
CURLE_UNSUPPORTED_PROTOCOL. Not me showing up with no socket π
π«Ά SEE ALSO π«Ά
okay that's the whole page, go read some raw bytes, you're gonna ate π β¨
libcurl Β· 2026-10-12 Β· curl_easy_recv(3) β mwah, sending you off with a kiss from the libcurl manual ππ¦π
π¦ where this page comes from
- fedora 44: libcurl-devel 8.18.0-14.fc44 Β· curl
- fedora 44: libcurl-devel 8.18.0-14.fc44 Β· curl
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms