如何使用自定义服务器手动发送RST?

时间:2014-03-20 03:49:16

标签: tcp tcpserver

我正在尝试调试一个场景,为此我希望http服务器通过RST关闭连接。现在它正在与fin / ack进行优雅的关闭。

有什么办法可以手动发送RST数据包来关闭连接作为当前流的一部分?可能是一个简单的自定义服务器?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

假设它是您自己的代码,请将setsockopt()调用option=SO_LINGER并将linger结构设置为l_onoff=1l_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));
...