Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/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
Http Go上下文处理程序是否有任何方法可以在未完全读取请求正文的情况下检测底层连接(客户端)是否消失_Http_Go_Tcp - Fatal编程技术网

Http Go上下文处理程序是否有任何方法可以在未完全读取请求正文的情况下检测底层连接(客户端)是否消失

Http Go上下文处理程序是否有任何方法可以在未完全读取请求正文的情况下检测底层连接(客户端)是否消失,http,go,tcp,Http,Go,Tcp,首先,正如它的答案所解释的,当服务器完全读取请求正文时,一切都按预期工作,我的意思是当客户端离开或被取消时,服务器将立即得到通知 但是我正在寻找一种方法,在不完全读取请求主体的情况下,服务器仍然能够检测到底层连接(客户机)已经消失,因此服务器甚至不再费心尝试读取请求主体 还有一点是,我发现我的Go http服务器在请求处理程序的ioutil.ReadAll(request.Body)上浪费了很多内存,最终bytes.makeSlice(2192.03MB 89.02%),我的意思是处理程序读取了

首先,正如它的答案所解释的,当服务器完全读取请求正文时,一切都按预期工作,我的意思是当客户端离开或被取消时,服务器将立即得到通知

但是我正在寻找一种方法,在不完全读取请求主体的情况下,服务器仍然能够检测到底层连接(客户机)已经消失,因此服务器甚至不再费心尝试读取请求主体

还有一点是,我发现我的Go http服务器在请求处理程序的
ioutil.ReadAll(request.Body)
上浪费了很多内存,最终
bytes.makeSlice(2192.03MB 89.02%)
,我的意思是处理程序读取了很多请求体,但后来发现实际上调用方/客户端已经超时/消失了

因此,我考虑在实际读取请求正文之前保留请求,如果在该阶段请求已经超时或被客户端取消,那么服务器可以立即终止处理程序链以节省资源,是否可以这样做


或者其他更好的方法来解决这个问题?

发送数据的客户端没有消失。应用程序是否可以将请求主体作为流处理,而不是将数据拖到内存中?应用程序能否对请求正文大小实施限制?@Ceriselimon在这种情况下,流方式没有多大意义,我觉得,我的意思是,只有当服务器累积了完整的请求负载时,它才能做一些有意义的事情,并且每个请求负载大小都已经有了限制,这里的重点主要是如何避免那些不必要的负载读取(就像客户端已经取消了请求,因为它已经进入超时,或者连接已经中断,但是现在的情况是只有在服务器读取了完整的负载之后,才能够检测到这样的事件)考虑客户端写入一些数据并关闭连接的情况。在检测到连接关闭之前,应用程序将读取TCP堆栈中缓冲的数据,但这是否足够值得关注?@CeriseLimón我想这就是问题所在,我想实现的是,由于连接已经中断或客户端超时已经达到,如果我能在之前检测到此类事件(现在只有在)读取TCP堆栈中缓冲的数据之后,服务器才可以直接丢弃它,因为没有必要做任何进一步的事情(目前,在根据mem使用情况读取数据之前,我先保留一点请求,然后根据服务器端超时设置决定是否继续,但这不是最优的,因为客户端超时可能更早到达,或者conn更早中断)