Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C套接字在HTTP站点开始挂起之前未接收所有数据_C_Sockets_Http - Fatal编程技术网

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

C套接字在HTTP站点开始挂起之前未接收所有数据,c,sockets,http,C,Sockets,Http,我正在尝试在C套接字中创建一个服务器,允许通过HTTP上传文件。我遇到的问题是,我得到了一个非常好的HTTP内容块,但它只是停止发送并开始挂起,也许在等待响应或其他什么?但是因为recv从来没有达到0,所以我的回答就永远不会出现。(甚至不确定这是为什么) 我环顾了一下谷歌,但大多数答案都是关于接收数据和循环,以便在我已经这样做的时候接收更多数据 代码如下: fp = fopen("fileName", "a"); for(;;)

我正在尝试在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 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