当我尝试将数据排入队列以发送到服务器时,我无法接收对多个 HTTP 请求的响应。
我们能够使用 tcp_write() 函数建立与服务器的连接,并立即在connected_callback()函数内发出HTTP请求(一旦与服务器建立连接就调用)。但是,如果我尝试使用以下语法生成两个或更多 HTTP 请求:
err_t connected_callback(void *arg, struct tcp_pcb *tpcb, err_t err) {
xil_printf("Connected to JUPITER server\n\r");
LWIP_UNUSED_ARG(arg);
/* set callback values & functions */
tcp_sent(tpcb, sent_callback);
tcp_recv(tpcb, recv_callback);
if (err == ERR_OK) {
char* request = "GET /circuits.json HTTP/1.1\r\n"
"Host: jupiter.info.polymtl.ca\r\n\r\n";
(void) tcp_write(tpcb, request, 100, 1);
request = "GET /livrable1/simulation.dee HTTP/1.1\r\n"
"Host: jupiter.info.polymtl.ca\r\n\r\n";
(void) tcp_write(tpcb, request, 100, 1);
tcp_output(tpcb);
xil_printf("tcp_write \n");
} else {
xil_printf("Unable to connect to server");
}
return err;}
我设法将所有数据发送到服务器,但我从未收到第二个 HTTP 请求的任何数据。我设法打印第一个请求的有效负载(JSON 文件),但我从未设法接收 .dee 文件的任何内容。是否有任何具体说明可以将 HTTP 请求与 lwIP 一起排队,或者我是否遗漏了某些内容?
如果您需要更多代码来准确分析我的问题,请随时说出来。
谢谢!
我看到的问题是您的请求标头语句末尾有两个
\r\n
组合。
您只需要在标题末尾添加
\r\n\r\n
。现在,你有双倍的时间。从第一次写入中删除。
我发现自己处于完全相同的情况,并从谷歌登陆这里找不到答案。
几个小时后,我发现如果我关闭 tcb 并在两次调用之间重新打开它,它就可以正常工作。
我不知道这是否是解决问题的最佳方式,但它确实有效。
char* request = "GET /circuits.json HTTP/1.1\r\n"
"Host: jupiter.info.polymtl.ca\r\n\r\n";
(void) tcp_write(tpcb, request, 100, 1);
tcp_sent(tpcb, NULL);
tcp_recv(tpcb, NULL);
err_t err = tcp_close(tpcb);
tpcb = tcp_new_ip_type(IP_GET_TYPE(&remote_addr));
tcp_sent(tpcb, send_callback);
tcp_recv(tpcb, recv_callback);
err_t err = tcp_connect(tpcb, &remote_addr, TCP_PORT, tcp_client_connected);
request = "GET /livrable1/simulation.dee HTTP/1.1\r\n"
"Host: jupiter.info.polymtl.ca\r\n\r\n";
(void) tcp_write(tpcb, request, 100, 1);