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

时间:2016-07-21 14:54:09

标签: sockets tcp shutdown fclose

如何在应用程序级别使用perl或C中的IO :: Socket :: INET重置SELECT r.* FROM Resources r WHERE r.fk_ResourceID = 'Drama Room' AND r.StartDate <= $EndDate AND r.EndDate >= $StartDate ORDER BY r.fk_ResourceID ASC; ed套接字?

在TCP端口上有一个程序acceptbindlisten是客户端连接,之后是acceptread一些数据。 如果我只是writeclose套接字,TCP层会正常终止(使用FIN数据包),而不是生成RST数据包。

1 个答案:

答案 0 :(得分:2)

您没有指定您正在使用的确切操作系统。我发现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);
  }
}