【问题标题】:(Socket/Networking) Is it possible to reconnect a Socket or my own Raw Socket?(套接字/网络)是否可以重新连接套接字或我自己的原始套接字?
【发布时间】:2022-01-27 05:41:04
【问题描述】:

我一直在挑战自己编写一种方法,以便在套接字断开后连接()返回(用于实验测试)。

如果我认为在 close() 调用后将在套接字上分配一个负文件描述符,我知道我无法关闭套接字

另外我不能 connect() 回来(以正式和常见的方式),因为在 RST 或最后一个 FIN ACK 之后,套接字将加入 Closed State + time_wait TIME_WAIT 不是问题,但关闭状态是问题。

分配一个新的文件描述符(通过 C++ 甚至 Java Injection 或 Kernel Modify 进行低级访问)不是一种方法,因为我的意思是重用相同的文件描述符。

谁能告诉我是否可以这样做?有没有可能? 或者是否可以通过使用原始套接字不加入任何“不可连接状态”?

【问题讨论】:

  • 能否提供断开已连接套接字的代码,然后尝试重新连接?
  • 它是 C++ 中的通用代码,我刚刚调试并让套接字处于称为“关闭”的给定状态,我已经搜索过它并且它自动发生并由内核完成,所以基本上你可以通过使用普通套接字来重现它
  • 不,无法重新连接套接字。您必须创建一个新套接字并建立一个新连接。
  • 即使你能做些什么来恢复连接,那又如何呢?在套接字的另一端有一个编程监听,它已经看到你的套接字端被关闭并且它已经关闭了它的连接端,所以在另一端没有任何东西可以让你再进行通信。
  • @MartinYork 我认为 OP 认为shutdown() API 旨在允许再次使用套接字。对于新的连接。

标签: c++ c sockets networking raw-sockets


【解决方案1】:

似乎操作系统会将用于建立连接的普通套接字视为已连接,即使在它转换为关闭状态之后也是如此。

使用相同文件描述符的解决方法是创建一个新套接字,然后使用dup2() 允许新套接字采用原始文件描述符。然后关闭为新套接字创建的文件描述符。

int renew_socket (int s) {
    int new_s = socket(PF_INET, SOCK_STREAM, 0);
    if (new_s < 0 || s < 0) return new_s;

    dup2(new_s, s);
    close(new_s);
    return s;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2017-02-17
    • 2016-08-01
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多