本文整理汇总了C++中curl_multi_fdset函数的典型用法代码示例。如果您正苦于以下问题:C++ curl_multi_fdset函数的具体用法?C++ curl_multi_fdset怎么用?C++ curl_multi_fdset使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了curl_multi_fdset函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: perform
static CURLMcode perform(CURLM * multi)
{
int handles;
CURLMcode code;
fd_set fdread, fdwrite, fdexcep;
struct timeval mp_start;
char mp_timedout = FALSE;
mp_timedout = FALSE;
mp_start = tutil_tvnow();
for (;;) {
static struct timeval timeout = /* 100 ms */ { 0, 100000L };
int maxfd = -1;
code = curl_multi_perform(multi, &handles);
if (tutil_tvdiff(tutil_tvnow(), mp_start) >
MULTI_PERFORM_HANG_TIMEOUT) {
mp_timedout = TRUE;
break;
}
if (handles <= 0)
return CURLM_OK;
switch (code) {
case CURLM_OK:
break;
case CURLM_CALL_MULTI_PERFORM:
continue;
default:
return code;
}
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
/* In a real-world program you OF COURSE check the return code of the
function calls. On success, the value of maxfd is guaranteed to be
greater or equal than -1. We call select(maxfd + 1, ...), specially in
case of (maxfd == -1), we call select(0, ...), which is basically equal
to sleep. */
if (select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout) == -1)
return (CURLMcode) ~CURLM_OK;
}
/* We only reach this point if (mp_timedout) */
if (mp_timedout) fprintf(stderr, "mp_timedout\n");
fprintf(stderr, "ABORTING TEST, since it seems "
"that it would have run forever.\n");
return (CURLMcode) ~CURLM_OK;
}
开发者ID:1498636925,项目名称:curl,代码行数:54,代码来源:lib536.c
示例2: registerUnregisterFds
static void registerUnregisterFds() {
int fd, fdMax;
FD_ZERO(&curlSrc->fdRead);
FD_ZERO(&curlSrc->fdWrite);
FD_ZERO(&curlSrc->fdExc);
curlSrc->fdMax = -1;
/* What fds does libcurl want us to poll? */
curl_multi_fdset(curlSrc->multiHandle, &curlSrc->fdRead,
&curlSrc->fdWrite, &curlSrc->fdExc, &curlSrc->fdMax);
if ((curlSrc->fdMax < -1) || (curlSrc->fdMax > GLIBCURL_FDMAX)) {
DEBUG_FAILURE(("registerUnregisterFds: fdMax=%d\n", curlSrc->fdMax));
}
/*fprintf(stderr, "registerUnregisterFds: fdMax=%d\n", curlSrc->fdMax);*/
assert(curlSrc->fdMax >= -1 && curlSrc->fdMax <= GLIBCURL_FDMAX);
fdMax = curlSrc->fdMax;
if (fdMax < curlSrc->lastPollFdMax) fdMax = curlSrc->lastPollFdMax;
/* Has the list of required events for any of the fds changed? */
for (fd = 0; fd <= fdMax; ++fd) {
gushort events = 0;
if (FD_ISSET(fd, &curlSrc->fdRead)) events |= GLIBCURL_READ;
if (FD_ISSET(fd, &curlSrc->fdWrite)) events |= GLIBCURL_WRITE;
if (FD_ISSET(fd, &curlSrc->fdExc)) events |= GLIBCURL_EXC;
/* List of events unchanged => no (de)registering */
if (events == curlSrc->lastPollFd[fd].events) continue;
DD((stdout, "registerUnregisterFds: fd %d: old events %x, "
"new events %x\n", fd, curlSrc->lastPollFd[fd].events, events));
/* fd is already a lastPollFd, but event type has changed => do nothing.
Due to the implementation of g_main_context_query(), the new event
flags will be picked up automatically. */
if (events != 0 && curlSrc->lastPollFd[fd].events != 0) {
curlSrc->lastPollFd[fd].events = events;
continue;
}
curlSrc->lastPollFd[fd].events = events;
/* Otherwise, (de)register as appropriate */
if (events == 0) {
g_source_remove_poll(&curlSrc->source, &curlSrc->lastPollFd[fd]);
curlSrc->lastPollFd[fd].revents = 0;
D((stderr, "unregister fd %d\n", fd));
} else {
g_source_add_poll(&curlSrc->source, &curlSrc->lastPollFd[fd]);
D((stderr, "register fd %d\n", fd));
}
}
curlSrc->lastPollFdMax = curlSrc->fdMax;
}
开发者ID:DirtYiCE,项目名称:glibcurl,代码行数:54,代码来源:glibcurl.cpp
示例3: fill_buffer
/* use to attempt to fill the read buffer up to requested number of bytes */
static int
fill_buffer(URL_FILE *file,int want,int waittime)
{
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd;
struct timeval timeout;
int rc;
(void) waittime;
/* only attempt to fill buffer if transactions still running and buffer
* doesnt exceed required size already
*/
if((!file->still_running) || (file->buffer_pos > want))
return 0;
/* attempt to fill buffer */
do
{
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
/* set a suitable timeout to fail on */
timeout.tv_sec = 60; /* 1 minute */
timeout.tv_usec = 0;
/* get file descriptors from the transfers */
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
switch(rc) {
case -1:
/* select error */
break;
case 0:
break;
default:
/* timeout or readable/writable sockets */
/* note we *could* be more efficient and not wait for
* CURLM_CALL_MULTI_PERFORM to clear here and check it on re-entry
* but that gets messy */
while(curl_multi_perform(multi_handle, &file->still_running) ==
CURLM_CALL_MULTI_PERFORM);
break;
}
} while(file->still_running && (file->buffer_pos < want));
return 1;
}
开发者ID:kotasher,项目名称:coverity,代码行数:55,代码来源:fopen.c
示例4: do_multi_select
static PyObject *
do_multi_select(CurlMultiObject *self, PyObject *args)
{
int max_fd = -1, n;
double timeout = -1.0;
struct timeval tv, *tvp;
CURLMcode res;
if (!PyArg_ParseTuple(args, "d:select", &timeout)) {
return NULL;
}
if (check_multi_state(self, 1 | 2, "select") != 0) {
return NULL;
}
if (timeout < 0 || timeout >= 365 * 24 * 60 * 60) {
PyErr_SetString(PyExc_OverflowError, "invalid timeout period");
return NULL;
} else {
long seconds = (long)timeout;
timeout = timeout - (double)seconds;
assert(timeout >= 0.0);
assert(timeout < 1.0);
tv.tv_sec = seconds;
tv.tv_usec = (long)(timeout*1000000.0);
tvp = &tv;
}
FD_ZERO(&self->read_fd_set);
FD_ZERO(&self->write_fd_set);
FD_ZERO(&self->exc_fd_set);
res = curl_multi_fdset(self->multi_handle, &self->read_fd_set,
&self->write_fd_set, &self->exc_fd_set, &max_fd);
if (res != CURLM_OK) {
CURLERROR_MSG("multi_fdset failed");
}
if (max_fd < 0) {
n = 0;
}
else {
Py_BEGIN_ALLOW_THREADS
n = select(max_fd + 1, &self->read_fd_set, &self->write_fd_set, &self->exc_fd_set, tvp);
Py_END_ALLOW_THREADS
/* info: like Python's socketmodule.c we do not raise an exception
* if select() fails - we'll leave it to the actual libcurl
* socket code to report any errors.
*/
}
return PyInt_FromLong(n);
}
开发者ID:0312birdzhang,项目名称:SailfishWeiboPyModule,代码行数:53,代码来源:multi.c
示例5: cover_thumbnailer_load_perform
static CURLcode
cover_thumbnailer_load_perform (CoverThumbnailer *cover,
CURL *curl_handle)
{
gint still_running;
struct timeval timeout;
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
gint rc = 0;
gint maxfd;
CURLcode code = CURLE_OK;
CURLMsg *msg;
do
{
/* start the action */
while (curl_multi_perform (cover->curl_multi, &still_running)
== CURLM_CALL_MULTI_PERFORM);
if (!still_running)
break;
/* timeout once per second */
timeout.tv_sec = 1;
timeout.tv_usec = 0;
FD_ZERO (&fdread);
FD_ZERO (&fdwrite);
FD_ZERO (&fdexcep);
/* get file descriptors from the transfers */
curl_multi_fdset (cover->curl_multi, &fdread, &fdwrite, &fdexcep, &maxfd);
rc = select (maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
/* select error */
if (rc == -1)
break;
}
while (still_running);
/* get return value */
msg = curl_multi_info_read (cover->curl_multi, &rc);
if (msg != NULL)
code = msg->data.result;
/* cleanup */
curl_multi_remove_handle (cover->curl_multi, curl_handle);
curl_easy_cleanup (curl_handle);
return code;
}
开发者ID:Distrotech,项目名称:tumbler,代码行数:52,代码来源:cover-thumbnailer.c
示例6: mget_url_smooth
/*******************************************************************************
* Function name - mget_url_smooth
*
* Description - Performs actual fetching of urls for a whole batch. Starts
* with initial fetch by mperform_smooth () and further acts
* using mperform_smooth () on select events
*
* Input - *bctx - pointer to the batch of contexts
*
* Return Code/Output - On Success - 0, on Error -1
********************************************************************************/
static int mget_url_smooth (batch_context* bctx)
{
int max_timeout_msec = 1000;
unsigned long now_time = get_tick_count ();
int cycle_counter = 0;
int still_running = 0;
struct timeval timeout;
mperform_smooth (bctx, &now_time, &still_running);
while (max_timeout_msec > 0)
{
int rc, maxfd;
fd_set fdread, fdwrite, fdexcep;
FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep);
timeout.tv_sec = 0;
timeout.tv_usec = 250000;
max_timeout_msec -= timeout.tv_sec*1000 + timeout.tv_usec * 0.001;
curl_multi_fdset(bctx->multiple_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
//fprintf (stderr, "%s - Waiting for %d clients with seconds %f.\n",
//name, still_running, max_timeout);
rc = select (maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
switch(rc)
{
case -1: /* select error */
break;
case 0: /* timeout */
now_time = get_tick_count ();
default: /* timeout or readable/writable sockets */
mperform_smooth (bctx, &now_time, &still_running);
break;
}
if (!(++cycle_counter % TIME_RECALCULATION_CYCLES_NUM))
{
now_time = get_tick_count ();
}
dispatch_expired_timers (bctx, now_time);
}
return 0;
}
开发者ID:adamscherer,项目名称:curl-loader,代码行数:62,代码来源:loader_smooth.c
示例7: fill_internal_buffer
/*
* Fills internal buffer up to want bytes.
* returns when size reached or transfer ended
*/
int fill_internal_buffer(churl_context* context, int want)
{
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd;
struct timeval timeout;
int nfds, curl_error;
/* attempt to fill buffer */
while (context->curl_still_running &&
((context->download_buffer->top - context->download_buffer->bot) < want))
{
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
/*
* Allow canceling a query while waiting for input from remote service
*/
CHECK_FOR_INTERRUPTS();
/* set a suitable timeout to fail on */
timeout.tv_sec = 5;
timeout.tv_usec = 0;
/* get file descriptors from the transfers */
if (CURLE_OK != (curl_error = curl_multi_fdset(context->multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd)))
elog(ERROR, "internal error: curl_multi_fdset failed (%d - %s)",
curl_error, curl_easy_strerror(curl_error));
if (maxfd <= 0)
{
context->curl_still_running = 0;
break;
}
if (-1 == (nfds = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout)))
{
if (errno == EINTR || errno == EAGAIN)
continue;
elog(ERROR, "internal error: select failed on curl_multi_fdset (maxfd %d) (%d - %s)",
maxfd, errno, strerror(errno));
}
if (nfds > 0)
multi_perform(context);
}
return 0;
}
开发者ID:BALDELab,项目名称:incubator-hawq,代码行数:55,代码来源:libchurl.c
示例8: FD_ZERO
/**
* downloadTimerCallback. At each call, check and perform transfers.
*/
void BCResourceHandleManagerCURL::downloadTimerCallback(WebCore::Timer<BCResourceHandleManagerCURL>* timer)
{
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd = 0;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
curl_multi_fdset(m_curlMultiHandle, &fdread, &fdwrite, &fdexcep, &maxfd);
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = selectTimeoutMS * 1000; // select waits microseconds
WebCore::setDeferringTimers(true);
int rc = ::select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
WebCore::setDeferringTimers(false);
if (-1 == rc) {
// we may end here if a timer fires on Linux (signals interrupt select)
// so we must either set timeout to 0, or enclose select()
// between setDeferringTimers() to disable timers
#ifndef NDEBUG
printf("bad: select() returned -1\n");
#endif
return;
}
int runningHandles = 0;
CURLMcode curlCode = CURLM_CALL_MULTI_PERFORM;
while (CURLM_CALL_MULTI_PERFORM == curlCode) {
curlCode = curl_multi_perform(m_curlMultiHandle, &runningHandles);
}
// check the curl messages indicating completed transfers
// and free their resources
int messagesInQueue;
while (CURLMsg* msg = curl_multi_info_read(m_curlMultiHandle, &messagesInQueue)) {
CURL* handle = msg->easy_handle;
assert(handle);
BCResourceHandleCURL* job;
curl_easy_getinfo(handle, CURLINFO_PRIVATE, &job);
job->processMessage(msg);
}
if (!m_downloadTimer.isActive() && (runningHandles > 0))
m_downloadTimer.startOneShot(pollTimeSeconds);
}
开发者ID:jackiekaon,项目名称:owb-mirror,代码行数:53,代码来源:BCResourceHandleManagerCURL.cpp
示例9: Curlreader_Read
size_t Curlreader_Read(CURLREADER *r, void *ptr, size_t size, size_t nmemb)
{
size*=nmemb;
while (r->still_running && (r->sbuf.len - r->pos) < size)
{
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd;
struct timeval timeout;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
timeout.tv_sec = 10;
timeout.tv_usec = 0;
r->errM = curl_multi_fdset(r->curlmh, &fdread, &fdwrite, &fdexcep, &maxfd);
if (r->errM != CURLM_OK) return 0;
switch(select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout)) {
case -1:
r->still_running = 0;
#ifdef _DEBUG
fputs("Curlreader select() error!", stderr);
#endif
break;
case 0: /* timeout */
default:
while((r->errM = curl_multi_perform(r->curlmh, &r->still_running)) ==
CURLM_CALL_MULTI_PERFORM);
if (r->errM != CURLM_OK) return 0;
break;
}
}
if (r->pos == (size_t)r->sbuf.len) return 0;
nmemb = r->sbuf.len - r->pos;
if (nmemb < size) {
memcpy(ptr, r->sbuf.str+r->pos, nmemb);
r->pos += nmemb;
return nmemb;
}
memcpy(ptr, r->sbuf.str+r->pos, size);
r->pos += size;
return size;
}
开发者ID:DeadZoneLuna,项目名称:SourceEngine2007,代码行数:50,代码来源:curlread.c
示例10: http_get_fds
int http_get_fds(fd_set *fdr, fd_set *fdw, fd_set *fde, void *d){
struct http_data *data=(struct http_data*)d;
int maxfd;
int ret;
if(data->cm==NULL)
return -2;
if((ret=curl_multi_fdset(data->cm,fdr,fdw,fde,&maxfd))){
return -3;
}
return maxfd;
}
开发者ID:heckendorfc,项目名称:newsbaoter,代码行数:14,代码来源:httpfetch.c
示例11: perform
static void perform() {
fd_set fdread, fdwrite, fdexcep;
int ret;
int maxfd;
int connections = 0;
select_timeout.tv_sec = 0;
select_timeout.tv_usec = 50000;
do {
do {
ret = check_multi(curl_multi_perform(curlm, &connections),
"curl_multi_perform() failed");
} while (ret == CURLM_CALL_MULTI_PERFORM);
if (show_progress) {
print_progress();
}
if (connections) {
size_t i;
for (i = 0; i < num_slices; ++i) {
if (slices[i].finished)
slice_finalize(&slices[i]);
}
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
check_multi(curl_multi_fdset(curlm, &fdread, &fdwrite, &fdexcep, &maxfd),
"curl_multi_fdset() failed");
ret = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &select_timeout);
if (ret == -1)
die("select() error: %s\n", strerror(errno));
}
} while (connections);
size_t i;
for (i = 0; i < num_slices; ++i) {
if (slices[i].curl)
slice_finalize(&slices[i]);
}
}
开发者ID:heuripedes,项目名称:sf,代码行数:49,代码来源:sf.c
示例12: l_multi_perform_internal
static int l_multi_perform_internal (lua_State *L) {
l_multi_userdata *privatep = LUACURL_PRIVATE_MULTIP_UPVALUE(L, 1);
CURLM *curlm = privatep->curlm;
CURLMcode rc;
int remain;
int n;
l_multi_perform_internal_getfrombuffer(L, privatep);
/* no data in buffer: try another perform */
while (lua_isnil(L, -1)) {
lua_pop(L, -1);
if (privatep->last_remain == 0)
return 0; /* returns nil*/
while ((rc = curl_multi_perform(curlm, &remain)) == CURLM_CALL_MULTI_PERFORM); /* loop */
if (rc != CURLM_OK)
luaL_error(L, "cannot perform: %s", curl_multi_strerror(rc));
privatep->last_remain = remain;
/* got data ? */
l_multi_perform_internal_getfrombuffer(L, privatep);
/* block for more data */
if (lua_isnil(L, -1) && remain) {
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
if ((rc = curl_multi_fdset(curlm, &fdread, &fdwrite, &fdexcep, &maxfd)) != CURLM_OK)
luaL_error(L, "curl_multi_fdset: %s", curl_multi_strerror(rc));
if ((n = select(maxfd+1, &fdread, &fdwrite, &fdexcep, NULL)) < 0)
luaL_error(L, "select: %s", strerror(errno));
}
}
/* unpack table */
n = lua_gettop(L);
lua_rawgeti(L, n, 1); /* data */
lua_rawgeti(L, n, 2); /* type */
lua_rawgeti(L, n, 3); /* easy */
lua_remove(L, n);
return 3;
}
开发者ID:LiXizhi,项目名称:NPLRuntime,代码行数:49,代码来源:Lua-cURL-multi.c
示例13: fetch_curl_fdset
static int fetch_curl_fdset(lwc_string *scheme, fd_set *read_set,
fd_set *write_set, fd_set *error_set)
{
CURLMcode code;
int maxfd = -1;
code = curl_multi_fdset(fetch_curl_multi,
read_set,
write_set,
error_set,
&maxfd);
assert(code == CURLM_OK);
return maxfd;
}
开发者ID:arczi84,项目名称:NetSurf-68k,代码行数:15,代码来源:curl.c
示例14: perform
static CURLMcode perform(CURLM * multi)
{
int handles, maxfd;
CURLMcode code;
fd_set fdread, fdwrite, fdexcep;
struct timeval mp_start;
char mp_timedout = FALSE;
mp_timedout = FALSE;
mp_start = tutil_tvnow();
for (;;) {
code = curl_multi_perform(multi, &handles);
if (tutil_tvdiff(tutil_tvnow(), mp_start) >
MULTI_PERFORM_HANG_TIMEOUT) {
mp_timedout = TRUE;
break;
}
if (handles <= 0)
return CURLM_OK;
switch (code) {
case CURLM_OK:
break;
case CURLM_CALL_MULTI_PERFORM:
continue;
default:
return code;
}
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
if (maxfd < 0)
return (CURLMcode) ~CURLM_OK;
if (select(maxfd + 1, &fdread, &fdwrite, &fdexcep, 0) == -1)
return (CURLMcode) ~CURLM_OK;
}
/* We only reach this point if (mp_timedout) */
if (mp_timedout) fprintf(stderr, "mp_timedout\n");
fprintf(stderr, "ABORTING TEST, since it seems "
"that it would have run forever.\n");
return (CURLMcode) ~CURLM_OK;
}
开发者ID:blog2i2j,项目名称:greentimer,代码行数:46,代码来源:lib536.c
示例15: selectThread
static gpointer selectThread(gpointer data) {
int fdCount;
struct timeval timeout;
assert(data == 0); /* Just to get rid of unused param warning */
D((stderr, "selectThread\n"));
g_mutex_lock(curlSrc->mutex);
D((stderr, "selectThread: got lock\n"));
curlSrc->selectRunning = TRUE;
while (curlSrc->selectRunning) {
FD_ZERO(&curlSrc->fdRead);
FD_ZERO(&curlSrc->fdWrite);
FD_ZERO(&curlSrc->fdExc);
curlSrc->fdMax = -1;
/* What fds does libcurl want us to poll? */
curl_multi_fdset(curlSrc->multiHandle, &curlSrc->fdRead,
&curlSrc->fdWrite, &curlSrc->fdExc, &curlSrc->fdMax);
timeout.tv_sec = GLIBCURL_TIMEOUT / 1000;
timeout.tv_usec = (GLIBCURL_TIMEOUT % 1000) * 1000;
fdCount = select(curlSrc->fdMax + 1, &curlSrc->fdRead, &curlSrc->fdWrite,
&curlSrc->fdExc, &timeout);
D((stderr, "selectThread: select() fdCount=%d\n", fdCount));
g_atomic_int_inc(&curlSrc->gtkBlockAndWait); /* "GTK thread, block!" */
D((stderr, "selectThread: waking up GTK thread %d\n",
curlSrc->gtkBlockAndWait));
/* GTK thread will almost immediately block in prepare() */
g_main_context_wakeup(NULL);
/* Now unblock GTK thread, continue after it signals us */
D((stderr, "selectThread: pre-wait\n"));
g_cond_wait(curlSrc->cond, curlSrc->mutex);
D((stderr, "selectThread: post-wait\n"));
}
curlSrc->selectThread = NULL;
D((stderr, "selectThread: exit\n"));
g_mutex_unlock(curlSrc->mutex);
return NULL;
}
开发者ID:ctbrowser,项目名称:glibcurl,代码行数:43,代码来源:glibcurl.cpp
示例16: LOG
void HttpProtocol::getFdSet(fd_set *read_fd_set,
fd_set *write_fd_set,
fd_set *exc_fd_set,
int *max_fd)
{
LOG(0, "enter getFdSet, read_fd_set = %p, write_fd_set = %p, exc_fd_set = %p, max_fd = %p\n",
read_fd_set, write_fd_set, exc_fd_set, max_fd);
// check task status.
CURLMcode retm = curl_multi_fdset(d->handle,
read_fd_set,
write_fd_set,
exc_fd_set,
max_fd);
if (retm != CURLM_OK)
{
throw DOWNLOADEXCEPTION(retm, "CURL", curl_multi_strerror(retm));
}
}
开发者ID:googollee,项目名称:libdownload,代码行数:20,代码来源:HttpProtocol.cpp
示例17: FD_ZERO
// Ask curl_multi for its handles directly
// This is preferable as we get to know which
// are blocking on reads, and which on writes.
int CurlMultiAwait::addLowHandles(req::ptr<CurlMultiResource> multi) {
fd_set read_fds, write_fds;
int max_fd = -1, count = 0;
FD_ZERO(&read_fds); FD_ZERO(&write_fds);
if ((CURLM_OK != curl_multi_fdset(multi->get(), &read_fds, &write_fds,
nullptr, &max_fd)) ||
(max_fd < 0)) {
return count;
}
for (int i = 0 ; i <= max_fd; ++i) {
int events = 0;
if (FD_ISSET(i, &read_fds)) events |= AsioEventHandler::READ;
if (FD_ISSET(i, &write_fds)) events |= AsioEventHandler::WRITE;
if (events) {
addHandle(i, events);
++count;
}
}
return count;
}
开发者ID:facebook,项目名称:hhvm,代码行数:23,代码来源:curl-multi-await.cpp
示例18: wait_perform
static int wait_perform()
{
fd_set rd, wr, ex;
int maxfd, nrunning;
long timeout;
CURLMcode errm;
FD_ZERO(&rd);
FD_ZERO(&wr);
FD_ZERO(&ex);
if (curl_multi_fdset(curl.multi, &rd, &wr, &ex, &maxfd) != CURLM_OK)
maxfd = -1, timeout = 1000;
else if (maxfd < 0)
timeout = 100; // as recommended by curl_multi_fdset(3)
else {
if (curl_multi_timeout(curl.multi, &timeout) != CURLM_OK)
timeout = 1000;
else if (timeout < 0)
timeout = 10000; // as recommended by curl_multi_timeout(3)
}
if (timeout > 0 && ! curl.perform_again) {
struct timeval tval;
tval.tv_sec = (timeout / 1000);
tval.tv_usec = (timeout % 1000) * 1000;
if (select(maxfd + 1, &rd, &wr, &ex, &tval) < 0) return -1;
}
errm = curl_multi_perform(curl.multi, &nrunning);
curl.perform_again = 0;
if (errm == CURLM_CALL_MULTI_PERFORM) curl.perform_again = 1;
else if (errm != CURLM_OK) { errno = multi_errno(errm); return -1; }
if (nrunning < curl.nrunning) process_messages();
return 0;
}
开发者ID:bbsunchen,项目名称:vt,代码行数:37,代码来源:hfile_libcurl.c
示例19: sdb_multi_run_and_wait
/**
* Run all deferred multi calls and wait for the result
*
* @param sdb the SimpleDB handle
* @return the result
*/
int sdb_multi_run_and_wait(struct SDB* sdb)
{
// This code was inspired by the implementation of readdir() in s3fs by Randy Rizun
int running, r;
while (curl_multi_perform(sdb->curl_multi, &running) == CURLM_CALL_MULTI_PERFORM) usleep(5);
while (running) {
fd_set read_fd_set;
fd_set write_fd_set;
fd_set exc_fd_set;
FD_ZERO(&read_fd_set);
FD_ZERO(&write_fd_set);
FD_ZERO(&exc_fd_set);
long ms;
if ((r = curl_multi_timeout(sdb->curl_multi, &ms)) != CURLM_OK) return SDB_CURLM_ERROR(r);
if (ms < 0) ms = 50;
if (ms > 0) {
struct timeval timeout;
timeout.tv_sec = 1000 * ms / 1000000;
timeout.tv_usec = 1000 * ms % 1000000;
int max_fd;
if ((r = curl_multi_fdset(sdb->curl_multi, &read_fd_set, &write_fd_set, &exc_fd_set, &max_fd)) != CURLM_OK) return SDB_CURLM_ERROR(r);
if (select(max_fd + 1, &read_fd_set, &write_fd_set, &exc_fd_set, &timeout) == -1) return SDB_E_FD_ERROR;
}
while (curl_multi_perform(sdb->curl_multi, &running) == CURLM_CALL_MULTI_PERFORM) usleep(5);
}
return SDB_OK;
}
开发者ID:Grantley,项目名称:libsdb,代码行数:43,代码来源:private.c
示例20: main
/*
* Simply download a HTTP file.
*/
int main(int argc, char **argv)
{
CURL *http_handle;
CURLM *multi_handle;
int still_running; /* keep number of running handles */
http_handle = curl_easy_init();
/* set the options (I left out a few, you'll get the point anyway) */
curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.haxx.se/");
curl_easy_setopt(http_handle, CURLOPT_DEBUGFUNCTION, my_trace);
curl_easy_setopt(http_handle, CURLOPT_VERBOSE, TRUE);
/* init a multi stack */
multi_handle = curl_multi_init();
/* add the individual transfers */
curl_multi_add_handle(multi_handle, http_handle);
/* we start some action by calling perform right away */
while(CURLM_CALL_MULTI_PERFORM ==
curl_multi_perform(multi_handle, &still_running));
while(still_running) {
struct timeval timeout;
int rc; /* select() return code */
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
/* set a suitable timeout to play around with */
timeout.tv_sec = 1;
timeout.tv_usec = 0;
/* get file descriptors from the transfers */
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
/* In a real-world program you OF COURSE check the return code of the
function calls, *and* you make sure that maxfd is bigger than -1
so that the call to select() below makes sense! */
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
switch(rc) {
case -1:
/* select error */
still_running = 0;
printf("select() returns error, this is badness\n");
break;
case 0:
default:
/* timeout or readable/writable sockets */
while(CURLM_CALL_MULTI_PERFORM ==
curl_multi_perform(multi_handle, &still_running));
break;
}
}
curl_multi_cleanup(multi_handle);
curl_easy_cleanup(http_handle);
return 0;
}
开发者ID:kevinw,项目名称:curl,代码行数:75,代码来源:multi-debugcallback.c
注:本文中的curl_multi_fdset函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论