从应用程序重置 TCP 套接字连接

Reset a TCP socket connection from application

如何使用 perl 或 C 中的 IO::Socket::INET 在应用程序级别重置 accepted 套接字?

有一个程序 binding,listening 在 TCP 端口上,accepts 一个客户端连接,之后它 reads 和 writes 一些数据。 如果我只是 closeshutdown 套接字,TCP 层优雅地终止(使用 FIN 数据包),而不是,我会生成一个 RST 数据包。

您没有指定确切的 OS 您正在使用。我发现 Linux 确实有一个 API 调用会重置 TCP 连接,我不知道它的便携性如何。方法是在已连接的套接字上使用 connect 系统调用,但这次是使用 AF_UNSPEC.

系列

以这种方式重置套接字后,甚至可以通过另一个 connect 调用再次连接套接字。

int main(int argc, char** argv)
{
  int fd = socket(AF_INET6, SOCK_STREAM, 0);

  while (1) {
    struct sockaddr_in6 sockaddr = {
      .sin6_family = AF_INET6,
      .sin6_port = htons(80),
      .sin6_flowinfo = 0,
      .sin6_scope_id = 0,
    };
    struct timespec s = {
      .tv_sec = 2,
      .tv_nsec = 0,
    };

    /* Connect to port 80 on localhost */
    inet_pton(AF_INET6, "::1", &sockaddr.sin6_addr.s6_addr);
    connect(fd, (struct sockaddr*)&sockaddr,sizeof(sockaddr));
    nanosleep(&s, NULL);

    /* Reset previously connected socket */
    sockaddr.sin6_family = AF_UNSPEC;
    connect(fd, (struct sockaddr*)&sockaddr,sizeof(sockaddr));
    nanosleep(&s, NULL);
  }
}