如何让 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 【问题描述】:

我有一个自己管理套接字连接的客户端(实际上使用libeventbufferevent)。现在,我想使用 libcurl 在该套接字上生成和发送 html GET 请求。我通过使用OPENSOCKET_FUNCTION 选项提供libcurl 来完成这部分,我已经打开的套接字。

但我现在的问题是 libeventlibcurl 都在监听套接字,有时是 libevent 在套接字有数据时响应套接字,有时是 libcurl

有没有办法告诉 libcurl 只生成并发送 GET 请求的 url,而不是在套接字上监听,这样我可以在 libcurl 将 url 写入套接字后处理我的问题?

显然,我将curl_multi 接口用于非阻塞套接字,否则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 请求?的主要内容,如果未能解决你的问题,请参考以下文章

Java 进程间通信

如何通过 Kotlin 在 Android 中使用套接字

我如何判断我是不是仍在监听 Android 中的套接字

C ++中的TCP服务器套接字打开失败

Laravel接收来自Pusher的消息

如何在接收响应时通过 websocket 发送请求