C套接字在HTTP站点开始挂起之前未接收所有数据
我正在尝试在C套接字中创建一个服务器,允许通过HTTP上传文件。我遇到的问题是,我得到了一个非常好的HTTP内容块,但它只是停止发送并开始挂起,也许在等待响应或其他什么?但是因为recv从来没有达到0,所以我的回答就永远不会出现。(甚至不确定这是为什么) 我环顾了一下谷歌,但大多数答案都是关于接收数据和循环,以便在我已经这样做的时候接收更多数据 代码如下:C套接字在HTTP站点开始挂起之前未接收所有数据,c,sockets,http,C,Sockets,Http,我正在尝试在C套接字中创建一个服务器,允许通过HTTP上传文件。我遇到的问题是,我得到了一个非常好的HTTP内容块,但它只是停止发送并开始挂起,也许在等待响应或其他什么?但是因为recv从来没有达到0,所以我的回答就永远不会出现。(甚至不确定这是为什么) 我环顾了一下谷歌,但大多数答案都是关于接收数据和循环,以便在我已经这样做的时候接收更多数据 代码如下: fp = fopen("fileName", "a"); for(;;)
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 OK\nContent-Type: text/plain\nContent-Length: 8\n\nRecieved";
write(fd, sendHeader, strlen(sendHeader));
break;
}
if(ret == -1) {
printf("Error recieving");
break;
}
fprintf(fp, "%s", buffer);
}
fclose(fp);
现在我只是将文件内容附加到一个文件中
我得到的实际结果是:
(用…缩写)
当我打印字节值时,我填充缓冲区2次,第3次它没有完全填充,只是挂起等待
有什么想法吗
但由于recv从未达到0,因此我的回答永远不会出现
如果客户端关闭连接,recv
将返回0。但是客户端不会关闭连接,因为它希望接收响应(好的,它可能会关闭以便写入),并且可能希望发送更多请求(HTTP持久连接)
相反,您必须解析HTTP请求,以确定客户端将在正文中发送多少数据。通常的方法是将设置为身体的大小。如果事先不知道大小,客户机可能会使用,但每个块都以其长度(十六进制)作为前缀
或者换句话说:如果您正试图实现HTTP,那么请通过研究而不是仅仅通过假设来熟悉该标准。这就是标准的真正含义
--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