C 套接字在 HTTP 站点开始挂起之前未接收所有数据



我正在尝试在 C 套接字中创建一个允许通过 HTTP 上传文件的服务器。我遇到的问题是我得到了很好的 HTTP 内容,但随后它只是停止发送并开始挂起,也许在等待响应或其他什么?但是由于 recv 从未达到 0,因此它永远不会得到我的响应。(不确定这甚至不是原因(。

我在谷歌上环顾四周,但大多数答案都是关于接收数据并在我已经这样做时循环接收更多。

这是代码:

            fp = fopen("fileName", "a");
            for(;;)
            {
                ret = recv(fd, buffer, BUFSIZE, 0);
                if(ret == 0){
\ Never gets here unless I cancel the web request manually (pressing x where refresh usually is)
                    printf("Finished recieving");
                    char* sendHeader = "HTTP/1.1 200 OKnContent-Type: text/plainnContent-Length: 8nnRecieved";
                    write(fd, sendHeader, strlen(sendHeader));
                    break;
                }
                if(ret == -1) {
                    printf("Error recieving");
                    break;
                }
                fprintf(fp, "%s", buffer);
            }
            fclose(fp);

现在我只是获取文件内容并将其附加到文件中。

我得到的实际结果是:

(使用...缩写(


--WebKitFormBoundaryRMGRl...
Content-Dispotion: form-data; name="filetoUpload"; filename...;
Content-type: application/octet-stream
n
Actual file contents
n
--WebKitFormBoundaryRMGRl...
Content-Disposition: form data; name="submit"
Upload License 
--WebKitFormBoundaryRMGRl...
Begins writing file contents again, writes about 10 lines, then hangs until I manually cancel request

当我打印字节值时,我填充缓冲区 2 次,然后第三次它没有完全填充它,只是挂起等待?

有什么想法吗?

但是由于 recv 从未达到 0,因此它永远不会得到我的回应......

如果客户端关闭连接,recv将返回 0。但是客户端不会关闭连接,因为它想要接收响应(好吧,它可以关闭以进行写入(,并且可能想要发送更多请求(HTTP 持久连接(。

相反,您必须解析 HTTP 请求以确定客户端将在正文中发送多少数据。执行此操作的常用方法是将内容长度标头设置为正文的大小。如果预先不知道大小,则客户端可能会使用分块传输编码,尽管每个块都以其长度(十六进制(为前缀。

或者换句话说:如果你试图实现HTTP,那么请通过研究它来熟悉标准,而不仅仅是做出假设。这就是标准的实际用途。

最新更新