49 #include <boost/asio.hpp> 50 #include <boost/bind.hpp> 53 #define MSG_OUT stdout 60 std::map<curl_socket_t, boost::asio::ip::tcp::socket *>
socket_map;
90 timer.expires_from_now(boost::posix_time::millisec(timeout_ms));
93 else if(timeout_ms == 0) {
95 boost::system::error_code error;
109 s =
"CURLM_CALL_MULTI_PERFORM";
112 s =
"CURLM_BAD_HANDLE";
115 s =
"CURLM_BAD_EASY_HANDLE";
118 s =
"CURLM_OUT_OF_MEMORY";
121 s =
"CURLM_INTERNAL_ERROR";
124 s =
"CURLM_UNKNOWN_OPTION";
133 s =
"CURLM_BAD_SOCKET";
174 int action,
const boost::system::error_code & error,
204 boost::asio::ip::tcp::socket *tcp_socket =
socket_map.find(s)->second;
207 tcp_socket->async_read_some(boost::asio::null_buffers(),
212 tcp_socket->async_write_some(boost::asio::null_buffers(),
248 fprintf(
MSG_OUT,
"\nsetsock: socket=%d, act=%d, fdp=%p", s, act, fdp);
250 std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it =
258 boost::asio::ip::tcp::socket * tcp_socket = it->second;
265 tcp_socket->async_read_some(boost::asio::null_buffers(),
273 tcp_socket->async_write_some(boost::asio::null_buffers(),
279 fprintf(
MSG_OUT,
"\nwatching for socket to become readable & writable");
281 tcp_socket->async_read_some(boost::asio::null_buffers(),
286 tcp_socket->async_write_some(boost::asio::null_buffers(),
296 int *fdp = (
int *)
calloc(
sizeof(
int), 1);
298 setsock(fdp, s, easy, action, 0, g);
305 fprintf(
MSG_OUT,
"\nsock_cb: socket=%d, what=%d, sockp=%p", s, what, sockp);
308 int *actionp = (
int *) sockp;
309 const char *whatstr[] = {
"none",
"IN",
"OUT",
"INOUT",
"REMOVE"};
312 "\nsocket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
325 "\nChanging action from %s to %s",
326 whatstr[*actionp], whatstr[what]);
327 setsock(actionp, s, e, what, *actionp, g);
337 size_t written = size * nmemb;
338 char *pBuffer = (
char *)
malloc(written + 1);
340 strncpy(pBuffer, (
const char *)ptr, written);
341 pBuffer[written] =
'\0';
351 static int prog_cb(
void *
p,
double dltotal,
double dlnow,
double ult,
376 boost::asio::ip::tcp::socket *tcp_socket =
380 boost::system::error_code ec;
381 tcp_socket->open(boost::asio::ip::tcp::v4(), ec);
385 std::cout << std::endl <<
"Couldn't open socket [" << ec <<
"][" <<
387 fprintf(
MSG_OUT,
"\nERROR: Returning CURL_SOCKET_BAD to signal error");
390 sockfd = tcp_socket->native_handle();
395 boost::asio::ip::tcp::socket *>(sockfd, tcp_socket));
407 std::map<curl_socket_t, boost::asio::ip::tcp::socket *>::iterator it =
453 "\nAdding easy %p to multi %p (%s)", conn->
easy, g->
multi, url);
461 int main(
int argc,
char **argv)
476 new_conn((
char *)
"www.google.com", &g);
static void event_cb(GlobalInfo *g, curl_socket_t s, int action, const boost::system::error_code &error, int *fdp)
std::map< curl_socket_t, boost::asio::ip::tcp::socket * > socket_map
static void setsock(int *fdp, curl_socket_t s, CURL *e, int act, int oldact, GlobalInfo *g)
struct _ConnInfo ConnInfo
boost::asio::io_service io_service
CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL *curl_handle)
static void mcode_or_die(const char *where, CURLMcode code)
static int prog_cb(void *p, double dltotal, double dlnow, double ult, double uln)
int main(int argc, char **argv)
struct _GlobalInfo GlobalInfo
CURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle, curl_socket_t sockfd, void *sockp)
static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
UNITTEST_START char * ptr
static int close_socket(void *clientp, curl_socket_t item)
#define curl_easy_setopt(handle, option, value)
static void check_multi_info(GlobalInfo *g)
CURL_EXTERN CURLM * curl_multi_init(void)
static void timer_cb(const boost::system::error_code &error, GlobalInfo *g)
#define curl_multi_setopt(handle, opt, param)
#define curl_easy_getinfo(handle, info, arg)
boost::asio::deadline_timer timer(io_service)
CURL_EXTERN CURL * curl_easy_init(void)
CURL_EXTERN void curl_easy_cleanup(CURL *curl)
static void remsock(int *f, GlobalInfo *g)
CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *curl_handle)
static void new_conn(char *url, GlobalInfo *g)
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)
#define CURL_SOCKET_TIMEOUT
char error[CURL_ERROR_SIZE]
CURL_EXTERN CURLMsg * curl_multi_info_read(CURLM *multi_handle, int *msgs_in_queue)
static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
static void addsock(curl_socket_t s, CURL *easy, int action, GlobalInfo *g)
static CURL * easy[MAX_EASY_HANDLES]
static curl_socket_t opensocket(void *clientp, curlsocktype purpose, struct curl_sockaddr *address)
CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, curl_socket_t s, int ev_bitmask, int *running_handles)
CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle)
#define calloc(nbelem, size)