Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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_Http_Sockets_Networking - Fatal编程技术网

从套接字C HTTP读取数据

从套接字C HTTP读取数据,c,http,sockets,networking,C,Http,Sockets,Networking,我想知道如何判断是否所有数据都是从套接字接收的。这是一个简单的web代理,目前我正在处理请求部分,因此发送的内容应以“\r\n\r\n”结尾。我不知道请求将持续多长时间。我在这里读过一些帖子,上面说我应该检查read函数是否返回了0?但是其他人说0只在客户端关闭连接时返回?否则我可以检查缓冲区的最后几个字符,看看它们是否与上面的匹配 计划只是将读取的数据加载到缓冲区中,如果有更多数据重复,则保存该数据 谢谢我认为你的计划几乎是对的。您需要一直将读取的数据加载到缓冲区中,直到找到所需的模式'\r\

我想知道如何判断是否所有数据都是从套接字接收的。这是一个简单的web代理,目前我正在处理请求部分,因此发送的内容应以“\r\n\r\n”结尾。我不知道请求将持续多长时间。我在这里读过一些帖子,上面说我应该检查read函数是否返回了0?但是其他人说0只在客户端关闭连接时返回?否则我可以检查缓冲区的最后几个字符,看看它们是否与上面的匹配

计划只是将读取的数据加载到缓冲区中,如果有更多数据重复,则保存该数据


谢谢

我认为你的计划几乎是对的。您需要一直将读取的数据加载到缓冲区中,直到找到所需的模式
'\r\n\r\n'
,然后您知道您拥有整个请求,可以将其传递到处理逻辑,从缓冲区中删除请求并重复。

这取决于您使用的是阻塞套接字还是非阻塞套接字

  • 如果您在非阻塞套接字上,它可以返回0并将errno设置为EAGAIN。这只是意味着你必须等待,然后再尝试阅读
  • 如果您在阻止套接字上,0将表示文件结束
    • 不是一个简单的协议,需要几个RFC。仅匹配双线馈送/新线不行。最起码,您必须解析请求头,以确定有什么编码,然后(可选地)遍历请求体


      查看或查看任何可用的开源web服务器以了解其复杂性。

      我刚刚使用了Berkeley sockets的默认值,我不确定这是阻塞还是非阻塞?-1在EAGAIN的情况下返回,而不是0。recv/read/recvmsg返回0表示另一端关闭了TCP连接。@默认值为阻塞。不,您没有\r\n\r\n终止标头。正文由其内容长度或分块终止,或仅由HTTP 1.0中的EOS终止。