- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个基本的 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/
除了这一行,我的代码有效 .FindFirst "[DONOR_CONTACT_ID] = strTemp2" 我希望我的代码检查是否有记录,其中存在特定的 DONOR_CONTACT_ID,因为有多
[FIN, ACK]、[RST]和[RST, ACK]是什么原因,如何避免? 是否是由于 SO 的 TCP 参数之间存在某种不匹配?服务器在 TCP/IP 连接中回复 [FIN, ACK] 是什么意思
我有简单的“echo”客户端-服务器代码,并通过tcpdump监视tcp流,客户端在发送274之后始终发送RST。总是。但是我不知道如何找到问题所在。客户端: //FILE to read from
当应用程序从套接字接收数据时,它将按照数据发送的正确顺序接收数据。 TCP 将知道如何根据每个数据包 header 中包含的序列号对数据重新排序。 但是 RST 数据包呢,例如:如果另一方发送了一些数
我正在尝试调试一个场景,为此我希望 http 服务器通过 RST 关闭连接。现在它正在使用 fin/ack 进行优雅的关闭。 有什么方法可以手动发送 RST 数据包以关闭连接作为当前流的一部分?可能是
为什么 TCP RST 数据包不需要确认?是不是因为RST的发送端每次收到对方的包都会继续发送RST? 相关说明,有效RST包中的确认号怎么会是0呢? 最佳答案 On a related note,
我真正喜欢 Markdown 的地方在于我可以执行以下操作: 写```回车 粘贴我剪贴板中的所有垃圾 编写``` 我现在有一个工作代码块 在 RST 中,我必须执行以下操作: 编写.. codeblo
如何获得在 rst 中加粗的代码(等宽)文本(我使用的是 Sphinx)? :: 中的任何内容似乎是按字面呈现的,就像 `` 一样,所以 ``**bold**`` 不起作用。 最佳答案 一般来说,嵌套
我正在使用 Sphinx 来记录返回字典的方法。 def do_stuff(foo, bar): """Do some stuff :param foo: I'm an argumen
我对将图像放入 pelican 的 markdown 语法感到困惑。 当我有了这个,一切正常。 .. image:: /images/Rugby-Tackle.jpg :alt: About
我有一个已连接的套接字,我想中止关闭它,但我不希望将 RST 发送到另一端。这可以吗? 最佳答案 您的问题体现了自相矛盾。 “异常关闭”== RST。 即使实际的中止关闭没有立即发送,TCP 也有义务
使用 shutdown() 关闭套接字连接的写入方向后,所有后续接收到的数据都会导致发送 RST 数据包,并且 read() 返回大小为 0 的数据,表示读取方向的 EOF。即使阅读方向没有关闭,为什
我有一个 RST 树,它的结构是: struct node { int key; node *left, *right; } *root; 我的功能是删除带有“v”键的节点: void
如果我有一个带有连接套接字的进程,并且我终止了这个进程,那么 Windows 将导致发送一个 RST 数据包。 是否保证(是否在某处记录)当进程终止时始终发送 RST 数据包,还是可以发送 FIN 数
我写了一个小命令行工具,想在文档中添加“--help”用法消息。 因为我很懒,所以我希望更新过程尽可能简单。这是我希望更新工作流程的样子: 导致更新使用消息的更新代码。 运行更新文档的脚本:新的用法消
我正在使用 gitlab docker image 来部署服务,Web 端口是主机上的 8080。运行 gitlab 后,我可以看到端口正常: CONTAINER ID IMAGE
我正在开发服务器,客户端消息通过手机发送。服务器和手机通过 Wifi 连接。 客户端向服务器发送 HTTP Post 消息,服务器应该回复 200 ok。它适用于大多数系统,但在某些系统中,服务器收到
在收到一个 TCP RST 数据包后,主机是否会丢弃接收缓冲区中已被远程主机确认但未被使用套接字的应用进程读取的所有剩余数据? 我想知道一旦我对其他主机所说的不再感兴趣(例如,为了节省资源)就关闭套接
我有一个客户端和服务器运行在同一台服务器(Linux 机器)上,它们之间有 TCP 连接。我观察到,当我杀死客户端时,内核/操作系统会在客户端被杀死 2 秒后发送 RST 数据包。我的问题是哪个内核参
Windows socket close(closesocket)函数生成RST。 在 Linux 上,当我调用 close 函数关闭一个 tcp 套接字时,它会通过来自客户端服务器的 fin/ack
我是一名优秀的程序员,十分优秀!