gpt4 book ai didi

c - HTTP 客户端从某些服务器获取 "Connection reset by peer"(TCP RST),但从其他服务器获取不到

转载 作者:行者123 更新时间:2023-11-30 18:04:59 25 4
gpt4 key购买 nike

我正在编写一个基本的 HTTP 客户端,但遇到了一个问题 - 某些 HTTP 服务器强制重置,导致“连接由对等方重置”错误。许多 HTTP 服务器确实会正常关闭连接,但似乎没有一个服务器能够保持连接处于事件状态。

但是,我确信这是我的客户端,因为使用非常相似的源代码的 HTTP 客户端不会表现出相同的行为:它们与相同服务器的连接要么正常关闭,要么保持事件状态。

是什么导致了这个看似不一致的问题?

相关代码:

/* socket */
if ((context->socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
perror("Failed to create socket");
exit(-1);
}

/* connect */
if (connect(context->socket, &context->tx_addr, sizeof(struct sockaddr)) != 0) {
perror("Couldn't connect to server");
exit(-1);
}

/* create header */
snprintf(context->packet, BUFF_SIZE,
"GET %s HTTP/1.1\r\n" \
"Host: %s\r\n\r\n",
conf->request, conf->host);

/* send header */
if ((sendto(context->socket, context->packet, BUFF_SIZE, 0,
NULL, 0))) != BUFF_SIZE) {
perror("Failed to send");
exit(-1);
}

/* receive response */
do {
if ((received = recvfrom(context->socket, context->packet, BUFF_SIZE, 0, NULL,
NULL)) < 0) {

/* THIS is where RST occurs with some servers */

perror("Failed to receive");
exit(-1)
}

if (received >= 0)
context->packet[received] = '\0';
printf("%s", context->packet);

} while (received > 0);

最佳答案

经过一番调查,很明显我的 HTTP 请求格式错误。

问题出在这段代码上:

/* create header */
snprintf(context->packet, BUFF_SIZE,
"GET %s HTTP/1.1\r\n" \
"Host: %s\r\n\r\n",
conf->request, conf->host);

/* send header */
if ((sendto(context->socket, context->packet, BUFF_SIZE, 0,
NULL, 0)) != BUFF_SIZE) {
perror("Failed to send entire buffer");
exit(-1);
}

请注意,即使我们在使用 snprintf 创建 header 时几乎肯定不会填充整个缓冲区,也会发送缓冲区中的 BUFF_SIZE 字节。生成的 header 中的垃圾也正在被传输。一些服务器只是忽略了错误的请求,其他服务器只是放弃并重置(RST)连接。

只需将发送代码更改为类似以下内容即可解决问题:

/* assuming context->packet is a string */
int len = strlen(context->packet);
int sent = 0, total = 0;

while (total < len) {
if ((sent = sendto(context->socket, context->packet + total,
len - total, 0, NULL, 0)) <= 0) {
perror("Failed to send");
exit(-1);
}
total += sent;
}

关于c - HTTP 客户端从某些服务器获取 "Connection reset by peer"(TCP RST),但从其他服务器获取不到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7123402/

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