Skip to content

Instantly share code, notes, and snippets.

@kunalekawde
Created June 16, 2019 05:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kunalekawde/fa8915cf5dbcac3148501119e30d8f63 to your computer and use it in GitHub Desktop.
Save kunalekawde/fa8915cf5dbcac3148501119e30d8f63 to your computer and use it in GitHub Desktop.
#include <string.h>
#include <curl/curl.h>
#include <unistd.h>
fd_set wfds;
fd_set rfds;
struct timeval tv;
int maxfd = 0;
int socket_callback(CURL *easy, /* easy handle */
curl_socket_t s, /* socket */
int what, /* describes the socket */
void *userp, /* private callback pointer */
void *socketp) /* private socket pointer */
{
FD_CLR(s, &wfds);
FD_CLR(s, &rfds);
if (what == CURL_POLL_IN || what == CURL_POLL_INOUT) {
FD_SET(s, &rfds);
}
if (what == CURL_POLL_OUT || what == CURL_POLL_INOUT) {
FD_SET(s, &wfds);
}
if (s > maxfd) { maxfd = s; }
return 0;
}
int timer_callback(CURLM *multi, /* multi handle */
long timeout_ms, /* see above */
void *userp) /* private callback pointer */
{
if (timeout_ms == -1) {
tv.tv_sec = 10;
tv.tv_usec = 0;
} else {
tv.tv_sec = timeout_ms / 1000;
tv.tv_usec = (timeout_ms % 1000) * 1000;
}
return 0;
}
int main(int argc, char** argv)
{
int running = 1;
static int cntit = 1;
curl_global_init(CURL_GLOBAL_ALL);
CURLSH *shobject = curl_share_init();
curl_share_setopt(shobject, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
FD_ZERO(&wfds);
FD_ZERO(&rfds);
CURLM *multi = curl_multi_init();
curl_multi_setopt(multi, CURLMOPT_SOCKETFUNCTION, socket_callback);
curl_multi_setopt(multi, CURLMOPT_TIMERFUNCTION, timer_callback);
curl_multi_setopt(multi, CURLMOPT_MAXCONNECTS, 100);
curl_multi_setopt(multi, CURLMOPT_MAX_HOST_CONNECTIONS, 10);
curl_multi_setopt(multi, CURLMOPT_MAX_TOTAL_CONNECTIONS, 1000);
curl_multi_setopt(multi, CURLMOPT_MAXCONNECTS, 128);
curl_multi_setopt(multi, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
int remaining = 5;
while (remaining >= 0) {
if ((cntit++ % 2) == 0)
sleep(150);
int i;
for (i = 0; i < 1; i++) {
remaining--;
CURL *easy = curl_easy_init();
//curl_easy_setopt(easy, CURLOPT_URL, "https://postman-echo.com/stream/5");
curl_easy_setopt(easy, CURLOPT_URL, "https://www.google.com/");
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1);
//curl_easy_setopt(easy, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE);
//curl_easy_setopt(easy, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
//curl_easy_setopt(easy, CURLOPT_PIPEWAIT, 1L);
//curl_easy_setopt(easy, CURLOPT_TIMEOUT, 0);
curl_easy_setopt(easy, CURLOPT_SHARE, shobject);
curl_multi_add_handle(multi, easy);
}
tv.tv_sec = 0;
tv.tv_usec = 0;
running = 1;
while (running) {
if (tv.tv_sec == 0 && tv.tv_usec == 0) {
curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, &running);
}
fd_set crfds = rfds;
fd_set cwfds = wfds;
int count = select(maxfd+1, &crfds, &cwfds, NULL, &tv);
if (!count) {
curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, &running);
}
else if (count == 0) {
curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, &running);
}
for (i = 0; i <= maxfd; i++) {
if (FD_ISSET(i, &crfds)) {
curl_multi_socket_action(multi, i, CURL_CSELECT_IN, &running);
}
if (FD_ISSET(i, &cwfds)) {
curl_multi_socket_action(multi, i, CURL_CSELECT_OUT, &running);
}
}
while (1) {
int msgq;
struct CURLMsg *msg = curl_multi_info_read(multi, &msgq);
if (msg && (msg->msg == CURLMSG_DONE)) {
CURL *easy = msg->easy_handle;
curl_multi_remove_handle(multi, easy);
curl_easy_cleanup(easy);
}
if (!msg) {
break;
}
}
}
}
curl_share_cleanup(shobject);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment