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
Http 如何使TCP接收处理异步(或无回声)客户端?_Http_Tcp_Nginx - Fatal编程技术网

Http 如何使TCP接收处理异步(或无回声)客户端?

Http 如何使TCP接收处理异步(或无回声)客户端?,http,tcp,nginx,Http,Tcp,Nginx,我已经编写了一个基于Webdis的简单HTTP服务器。现在我遇到了一个问题,当客户端发送HTTP请求而不接收响应时(也就是说,只发送,不接收来自服务器的响应),服务器将接收多个HTTP请求,这将导致解析模块失败(这可能是解析模块中的错误)。如果有模糊的地方,我的一些代码: /* client... */ int fd = connect_server(); while (1) { send(fd, buf, sz); continue; /* no receive.. */

我已经编写了一个基于Webdis的简单HTTP服务器。现在我遇到了一个问题,当客户端发送HTTP请求而不接收响应时(也就是说,只发送,不接收来自服务器的响应),服务器将接收多个HTTP请求,这将导致解析模块失败(这可能是解析模块中的错误)。如果有模糊的地方,我的一些代码:

/* client... */
int fd = connect_server();
while (1) {
    send(fd, buf, sz);
    continue; /* no receive.. */        
}

/* server... */
/* some event trigger following code */
char buffer[4096]; /* a stack based receive buffer, buggy */
ret = recv(fd, buffer, sizeof(buffer));
当客户端在服务器睡眠(用于调试)期间发送10个HTTP请求(小于4096字节)时,下一次接收将一次接收10个请求,但解析器无法解析多个请求,这使得所有这些请求都失败。如果所有这些请求都大于4096,这将切断其中一个请求并仍然失败

我浏览了Nginx源代码,可能是回调设计的(不是责备),我还没有找到它的解决方案


有没有办法做到以下几点:


如何控制每次只接收一个请求的
recv
呼叫?或者是否存在某种与TCP相关的机制,使得只接收一个
发送
请求成为可能?

这与同步性或事件无关,但与此类套接字的流性质有关。您必须缓冲以前接收到的数据,并且必须完整地实现HTTP的某些部分,以便能够将传入的请求标记为完成,之后您可以从缓冲区中释放它并开始解析它。

TCP根据定义是基于流的,因此,您永远无法保证消息边界将得到响应。严格来说,TCP中不存在这样的东西。但是,使用阻塞套接字并确保禁用Nagle的算法,可以减少每个recv()包含多个段的可能性。为了进行测试,您还可以在每次发送()之后插入睡眠。你也可以玩TCP_CORK

然而,我建议您“正确”地实现接收,而不是将某些东西拼凑在一起,因为您将不得不在某个时候这样做。对于每个recv调用,检查缓冲区是否包含HTTP请求的结尾(\r\n\r\n),然后处理