如何避免在无响应的服务器上阻塞 connect()

问题描述 投票:0回答:1

我正在尝试连接到

1.1.1.1
上的 80 和 800 端口。我预计
connect()
会在
1.1.1.1:800
上失败,但它完全阻止了我的程序。

我尝试使用

SOCK_NONBLOCK
,但在这么小的应用程序上进行异步操作似乎不合适。

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>

void foo(uint16_t port) {
  printf("Starting for %d...\n", port);
  int sockfd = socket(AF_INET, SOCK_STREAM, 0);
  
  struct sockaddr_in sockaddr_in;
  sockaddr_in.sin_family = AF_INET;
  sockaddr_in.sin_addr.s_addr = inet_addr("1.1.1.1");
  sockaddr_in.sin_port = htons(port);
  
  printf(
    "connect: %d\n",
    connect(sockfd, (struct sockaddr*)&sockaddr_in, sizeof(sockaddr_in))
  );

  printf("Errno: %d\n", errno);

  close(sockfd);
}

int main() {
  foo(80);
  foo(800);
}

输出:

Starting for 80...
connect: 0
Errno: 0
Starting for 800...

c linux sockets client
1个回答
0
投票

建立 TCP 涉及发送消息和接收回复。

这必然是非瞬时的。如果你想获得结果,你必然需要等待结果,要么通过阻塞,要么使用异步操作。

您似乎认为第一次尝试

connect
并没有被阻止,但它确实被阻止了。它只是没有阻塞那么久。 1.1.1.1 可能主动拒绝了与 80 的连接。但它可能会忽略与 800 的连接或将它们重定向到离线计算机,从而使客户端没有响应直到超时为止。

© www.soinside.com 2019 - 2024. All rights reserved.