【发布时间】:2018-01-27 10:39:52
【问题描述】:
我在使用 connect() API 连接到目标 IP 时遇到问题。 connect() API 返回 -1 和 errno 作为 operation in progress
。我是否在建立连接之前过早地检查返回码?请看以下代码sn-p:
struct sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(9190);
const char * remoteIp = 10.10.20.86;
rc = inet_pton(AF_INET,remoteIp, &servAddr.sin_addr);
if (rc == -1 || errno == EAFNOSUPPORT)
{
return 0;
}
rc = connect(fd, (sockaddr*)&servAddr, sizeof(servAddr));
if ( rc < 0) // this is where it fails. rc is -1.
{
log("connect failure with [%s]",strerror(errno));
print_sock_connect_error();
}
我有两个问题:
- 目标 IP 和端口
10.10.20.86:9190正在等待连接,一旦接收到连接,它会将 ack 发送回源。我在 pcap 中看到了已建立的 tcp - ACK、SYN/ACK 和 ACK 到目的地 - 但仍然无法弄清楚为什么它返回-1时出错。那么我是在连接建立完成之前检查 rc 吗?sysctl net.ipv4.tcp_syn_retries设置为 6。 - 上面的代码有问题吗?
【问题讨论】:
-
请不要发送带有标签的垃圾邮件。即使问题可能同时适用于 C 和 C++,也只能使用您实际编程的语言的标签,因为这会影响可能的解决方案。
-
在不相关的说明中,您检查来自
inet_pton的错误的条件存在缺陷。如果有错误,或者有 no 错误但errno恰好是EAFNOSUPPORT,则返回0。如果没有错误(即inet_pton不返回-1),那么errno的值是不确定的和未知的。那就别查了。