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
Sockets 客户机已确认';我发送给它的所有数据?_Sockets_Tcp_Network Programming_Httpserver_Http Proxy - Fatal编程技术网

Sockets 客户机已确认';我发送给它的所有数据?

Sockets 客户机已确认';我发送给它的所有数据?,sockets,tcp,network-programming,httpserver,http-proxy,Sockets,Tcp,Network Programming,Httpserver,Http Proxy,RFC 7230定义了HTTP/1.1协议,它在6.6“连接管理.拆卸”中有一段有趣的话: 为了避免TCP重置问题,服务器通常会关闭连接 分阶段进行。首先,服务器通过只关闭 读/写连接的写端。然后服务器继续运行 从连接读取数据,直到它收到相应的关闭提示 客户端,或直到服务器合理确定其自己的TCP 堆栈已收到客户端对数据包的确认 包含服务器的最后一个响应。最后,服务器完全恢复 关闭连接 基本上可以归结为以下几点: shutdown(s, SD_SEND); while (recv(s, throa

RFC 7230定义了HTTP/1.1协议,它在6.6“连接管理.拆卸”中有一段有趣的话:

为了避免TCP重置问题,服务器通常会关闭连接 分阶段进行。首先,服务器通过只关闭 读/写连接的写端。然后服务器继续运行 从连接读取数据,直到它收到相应的关闭提示 客户端,或直到服务器合理确定其自己的TCP 堆栈已收到客户端对数据包的确认 包含服务器的最后一个响应。最后,服务器完全恢复 关闭连接

基本上可以归结为以下几点:

shutdown(s, SD_SEND);
while (recv(s, throaway_buffer, throaway_buffer_len, 0) > 0);
closesocket(s);
这是正常关机的标准方式。但是,它也承认可能存在行为不端的客户端(即使在收到带有
连接:close
头的响应后仍继续发送请求),并且服务器必须在确定客户端已收到最后一个响应后通过重设连接来应对


但是,套接字接口似乎没有提供功能来了解传递给
send
的所有数据是否已由远程主机实际发送和确认。它真的在那里吗?如果没有它,我所能想到的就是设置一个计时器,然后调用
recv
,直到它发出远程主机已关闭连接或超时的信号,以先到者为准。但是什么是适当的超时?60秒可以吗?

Sockets接口通过很少使用且不太容易理解的
SO_LINGER
选项提供这一含义。除其他外,它允许您定义一个超时,在发送挂起数据期间,
close()
和可能的
shutdown()
将被阻止。它几乎没有实际用途,正如我所说,它很少被使用。。。至少很少正确使用