如何让 libcurl 不监听套接字只是通过它发送一个 url 请求?
Posted
技术标签:
【中文标题】如何让 libcurl 不监听套接字只是通过它发送一个 url 请求?【英文标题】:How to ask libcurl not to listen on a socket just send a url request over it? 【发布时间】:2012-08-18 18:33:13 【问题描述】:我有一个自己管理套接字连接的客户端(实际上使用libevent
的bufferevent
)。现在,我想使用 libcurl
在该套接字上生成和发送 html GET
请求。我通过使用OPENSOCKET_FUNCTION
选项提供libcurl
来完成这部分,我已经打开的套接字。
但我现在的问题是 libevent
和 libcurl
都在监听套接字,有时是 libevent
在套接字有数据时响应套接字,有时是 libcurl
。
有没有办法告诉 libcurl 只生成并发送 GET
请求的 url,而不是在套接字上监听,这样我可以在 libcurl
将 url 写入套接字后处理我的问题?
显然,我将curl_mult
i 接口用于非阻塞套接字,否则curl_easy_perform
在收到答案之前不会返回。
我不想让bufferevent
监听器继续使用libcurl
,因为它是一个多协议程序,我正在实现它的http 部分。其他协议没有使用libcurl
的奢侈,所以我需要保留bufferevent
结构。
【问题讨论】:
【参考方案1】:您可能正在寻找curl_multi_socket_action() 函数。 curl 在hiperfifo.c 源代码中提供了将该函数与 libevent 一起使用的示例。
【讨论】:
我做了以下事情: 1. 仅在创建事件时激活 EV_WRITE:“event* write_url_event = event_new(the_event, the_socket, EV_WRITE, curl_socket_event_cb, arg);" 2.禁用libevent写回调:“bufferevent_disable(conn->buffer, EV_WRITE);” 3. 当事件回调被调用时,我只用 CURL_CSELECT_OUT 调用 curl_multi_socket_action(): "rc = curl_multi_socket_action(curl_multi_handle, fd, CURL_CSELECT_OUT, &curl_running_handle);"我仍然丢失了一些由套接字上的对等方发送的数据包。我从来没有在另一边收到过它们。会不会是 libcurl 的错误? 这不是 libcurl 论坛,详细问题请到 libcurl 列表中提问。它可能是库中的错误,也可能是您的应用程序中的错误。或两者。通用方法仍然如我所描述并记录在案。 很抱歉在接受过程中一蹶不振。它实际上工作得很好。问题是我使用的终端在打印出所有标准错误时并不诚实,因此,我认为我正在丢失数据包。以上是关于如何让 libcurl 不监听套接字只是通过它发送一个 url 请求?的主要内容,如果未能解决你的问题,请参考以下文章