我正在尝试调试一个场景,为此我希望http服务器通过RST关闭连接。现在它正在与fin / ack进行优雅的关闭。
有什么办法可以手动发送RST数据包来关闭连接作为当前流的一部分?可能是一个简单的自定义服务器?
提前感谢您的帮助。
答案 0 :(得分:3)
假设它是您自己的代码,请将setsockopt()
调用option=SO_LINGER
并将linger
结构设置为l_onoff=1
和l_linger=0
,然后关闭套接字。任何仍然缓冲的出站数据都将丢失,其中包括已发送但未确认的数据。
仅用于测试。这是不安全和不友善的。
如果您的代码不在服务器中,请编写一个执行大型资源GET的客户端并关闭连接而不读取任何响应。
资料来源:W.R。Stevens 等,Unix网络编程,第1卷,第3版,第202页。
答案 1 :(得分:0)
作为参考,setsockopt()的代码片段带有逗号。感谢@EJB的帮助。 设置此选项后,服务器将关闭与RST的连接。
...
struct linger so_linger;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
so_linger.l_onoff = 1;
so_linger.l_linger = 0;
setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(so_linger));
...