gpt4 book ai didi

sockets - C套接字服务器: What's the right way to read all of an unknown length XMLHttpRequest?

转载 作者:行者123 更新时间:2023-12-03 12:02:12 26 4
gpt4 key购买 nike

我有一个用C编写的简单XMLHttpRequest处理程序。它读取并处理来自浏览器中运行的JavaScript XMLHttpRequest send()的请求。
父进程接受传入的连接,并为每个传入的连接派生一个子进程以读取和处理数据。
它对大多数请求都非常有效,但在某些情况下(显然与客户端和服务器之间的网络基础结构有关)会失败,如果请求的长度超过2K字节。我假设该请求被分解为浏览器和套接字服务器之间某个位置的多个数据包。
我无法更改请求格式,但可以看到正在发送的请求并验证内容。数据是带有包含“类型”字段的编码URI的“GET”。如果类型为"file",则请求的长度可能为3K,否则最多为数百个字节。 "file"请求很少-用户正在提供要写入服务器上文件的配置数据。所有其他请求都可以正常工作,任何小于大约2K的"file"请求都可以正常工作。
在这种情况下,确保我拥有所有数据的首选技术是什么?
这是父级接受连接并 fork 子级的部分(非阻塞版本):

  for (hit = 1;; hit++) {
length = sizeof(cli_addr);
if ((socketfd = accept4(listensd, (struct sockaddr *) &cli_addr, &length, SOCK_NONBLOCK)) < 0){
//if ((socketfd = accept(listensd, (struct sockaddr *) &cli_addr, &length)) < 0){
exit(3);
}
if ((pid = fork()) < 0) {
exit(3);
} else {
if (pid == 0) { /* child */
//(void) close(listensd);
childProcess(socketfd, hit); /* never returns. Close listensd when done*/
} else { /* parent */
(void) close(socketfd);
}
}
}
这是子进程中执行初始recv()的部分。对于长文件请求,子级的第一个套接字recv()获得约1700字节的有效负载,后跟浏览器提供的连接数据。
  ret = recv(socketfd, recv_data, BUFSIZE, 0); // read request
if (ret == 0 || ret == -1) { // read failure stop now
sprintf(sbuff, "failed to read request: %d", ret);
logger(&shm, FATAL, sbuff, socketfd);
}
recv_data[ret] = 0;
len = ret;
如果类型为"file",则可能会有更多数据。子进程永远不会获取其余数据。如果套接字阻塞,则第二次读取尝试将挂起。如果套接字是非阻塞的(如下面的代码片段所示),则所有后续读取都将返回-1,并显示错误“资源暂时不可用”,直到超时:
// It's a file. Could be broken into multiple blocks. Try second read
sleep(1);
ret = recv(socketfd, &recv_data[len], BUFSIZE, 0); // read request
while (ret != 0){
if(ret > 0){
recv_data[len+ret] = 0;
len += ret;
} else {
sleep(1);
}
ret = recv(socketfd, &recv_data[len], BUFSIZE, 0); // read request
}

我希望当客户端关闭连接时read()会返回0,但这不会发生。

最佳答案

GET请求只有一个头而没有主体(嗯,几乎总是这样),因此,只要拥有请求头,就可以拥有客户端已发送的所有内容,并且当您读取空白时,便知道已读取整个请求头行,即两次返回(且不迟早)。
如果客户端仅发送一部分,而没有空白行,则您应该等待其余部分。我会对此超时,如果花费太长时间,则拒绝整个请求。
顺便说一句,仍然有一些浏览器,也许还有一些代理,URL长度限制约为2000个字符。

关于sockets - C套接字服务器: What's the right way to read all of an unknown length XMLHttpRequest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64556572/

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