我正在尝试连接到
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...
建立 TCP 涉及发送消息和接收回复。
这必然是非瞬时的。如果你想获得结果,你必然需要等待结果,要么通过阻塞,要么使用异步操作。
您似乎认为第一次尝试
connect
并没有被阻止,但它确实被阻止了。它只是没有阻塞那么久。 1.1.1.1 可能主动拒绝了与 80 的连接。但它可能会忽略与 800 的连接或将它们重定向到离线计算机,从而使客户端没有响应直到超时为止。