我正在尝试在 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,那么请通过研究它来熟悉标准,而不仅仅是做出假设。这就是标准的实际用途。