gpt4 book ai didi

c - 无法使用 libcurl 读取数据

转载 作者:行者123 更新时间:2023-11-30 14:27:44 25 4
gpt4 key购买 nike

下面是我的代码:

#include <stdio.h>
#include <string.h>
#include <curl/curl.h>

/* Auxiliary function that waits on the socket. */
static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
{
struct timeval tv;
fd_set infd, outfd, errfd;
int res;

tv.tv_sec = timeout_ms / 1000;
tv.tv_usec= (timeout_ms % 1000) * 1000;

FD_ZERO(&infd);
FD_ZERO(&outfd);
FD_ZERO(&errfd);

FD_SET(sockfd, &errfd); /* always check for error */

if(for_recv)
{
FD_SET(sockfd, &infd);
}
else
{
FD_SET(sockfd, &outfd);
}

/* select() returns the number of signalled sockets or -1 */
res = select(sockfd + 1, &infd, &outfd, &errfd, &tv);
return res;
}

int main(void)
{
CURL *curl;
CURLcode res;
/* Minimalistic http request */
const char *request = "reactantsJSON={\"O=O\":{\"N\":1}}&productsJSON=[\"O=O\",\"[O]\"]&temperature=2273.15&pressure=101.325";
curl_socket_t sockfd; /* socket */
long sockextr;
size_t iolen;

curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://gibbs.sdsu.edu:8080/axis2/services/GibbsMinimization/solveTP");
/* Do not do the transfer - only connect to host */
curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
res = curl_easy_perform(curl);

if(CURLE_OK != res)
{
printf("Error: %s\n", strerror(res));
return 1;
}

/* Extract the socket from the curl handle - we'll need it for waiting.
* Note that this API takes a pointer to a 'long' while we use
* curl_socket_t for sockets otherwise.
*/
res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockextr);

if(CURLE_OK != res)
{
printf("Error: %s\n", curl_easy_strerror(res));
return 1;
}

sockfd = sockextr;

/* wait for the socket to become ready for sending */
if(!wait_on_socket(sockfd, 0, 60000L))
{
printf("Error: timeout.\n");
return 1;
}

puts("Sending request.");
/* Send the request. Real applications should check the iolen
* to see if all the request has been sent */
res = curl_easy_send(curl, request, strlen(request), &iolen);

if(CURLE_OK != res)
{
printf("Error: %s\n", curl_easy_strerror(res));
return 1;
}
puts("Reading response.");

/* read the response */
for(;;)
{
char buf[1024];

wait_on_socket(sockfd, 1, 60000L);
res = curl_easy_recv(curl, buf, 1024, &iolen);

if(CURLE_OK != res)
break;

printf("Received %u bytes.\n", iolen);

}

/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}

我正在发送一个 Json 字符串,我期望的响应是一个 XML 文档。当我编译代码时,它编译时没有错误。但由于某种原因,它没有进入接收函数的 for 循环。任何形式的帮助将不胜感激。提前致谢。

最佳答案

$ gdb ./a.out
GNU gdb (GDB) 7.2-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from a.out...done.
(gdb) b 98
Breakpoint 1 at 0x400f5d: file c.c, line 98.
(gdb) run
Starting program: a.out
[Thread debugging using libthread_db enabled]
Sending request.
Reading response.

Breakpoint 1, main () at c.c:99
99 if(CURLE_OK != res)
(gdb) p res
$1 = CURLE_UNSUPPORTED_PROTOCOL
(gdb)

您必须将所有内容放在 request 中的第一个斜线之后,而不是放在curl_easy_setopt中,所以

curl_easy_setopt(curl, CURLOPT_URL, "http://gibbs.sdsu.edu:8080");

const char *request = "GET /axis2/services/GibbsMinimization/solveTP?reactantsJSON={\"O=O\":{\"N\":1}}&productsJSON=[\"O=O\",\"[O]\"]&temperature=2273.15&pressure=101.325 HTTP/1.0\r\n\r\n";

因为您手动执行http请求

另外,用全零初始化 buf 的方法是

char buf[1024]={0};

关于c - 无法使用 libcurl 读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7369051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com