首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从应用程序重置TCP套接字连接

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

Stack Overflow用户
提问于 2016-07-21 22:54:09
回答 1查看 5.5K关注 0票数 1

如何在应用程序级使用Perl语言或C语言中的IO:: socket ::INET重置accepted套接字?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-17 20:34:48

您没有指定您正在使用的确切操作系统。我发现Linux确实有一个可以重置TCP连接的API调用,我不知道它的可移植性。方法是在已经连接的套接字上使用connect系统调用,但这次使用家族AF_UNSPEC

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

代码语言:javascript
代码运行次数:0
运行
复制
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);
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38507586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档