【问题标题】:connect() hang for long time upon connection refused [duplicate]连接被拒绝后,connect()长时间挂起[重复]
【发布时间】:2018-12-02 15:22:43
【问题描述】:

我有一个小代理,应该不时连接到服务器 第一阶段它打开一个socket

const char* hostname // e.g. "127.0.0.1"   
hostaddr = inet_addr(hostname);

    /* Ultra basic "connect to port 22 on localhost"
     * Your code is responsible for creating the socket establishing the
     * connection
     */ 
    sock = socket(AF_INET, SOCK_STREAM, 0);

    sin.sin_family = AF_INET;
    sin.sin_port = htons(22);
    sin.sin_addr.s_addr = hostaddr;
    if (connect(sock, (struct sockaddr*)(&sin),
                sizeof(struct sockaddr_in)) != 0) {
        fprintf(stderr, "failed to connect!\n");
        return -1;
    }

ip-address 无效时,似乎连接挂起很长时间 失败前

查看man page 提供有关该主题的一些数据,但不提供如何超越它

我的问题是为什么以及如何为其添加超时(或任何其他解决方案)

【问题讨论】:

  • “连接被拒绝”会在几秒钟内发生。您的意思是“连接超时”吗?
  • '我有一个小代理' - 如果它是你应用程序中的一个子系统,你能不把它全部关闭吗?
  • 我有很多虚拟机从服务器请求更新/信息,本节在连接之前对连接进行“验证”
  • 这完全是浪费时间。你应该只是联系,而不是试图预测未来。
  • @EJP 我尊重你的意见,但你错了

标签: c++ linux sockets


【解决方案1】:

引用自here的答案之一

在连接之前将套接字置于非阻塞模式,然后在连接建立后将其恢复为阻塞模式。

【讨论】:

  • 正确的做法是将这个问题标记为另一个问题的副本,而不是引用另一个问题的答案。您甚至没有引用最佳答案,因为其他几个答案解释了如何实现超时,但您引用的答案没有。
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2021-04-24
  • 2019-06-28
  • 1970-01-01
  • 2017-10-25
相关资源
最近更新 更多