gpt4 book ai didi

c++ - connect() 在连接被拒绝时中断套接字

转载 作者:行者123 更新时间:2023-11-28 00:30:19 29 4
gpt4 key购买 nike

当我在 connect() 之后尝试 send() 时,我一直在与我的程序中的一个错误作斗争,当我收到信号 SIGPIPE 时>。仅当 connect() 至少出现一次“连接被拒绝”时才会发生该错误。这是旧的错误代码:

getaddrinfo("127.0.0.1", "1443", &hints, &res);
s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
while (connect(s, res->ai_addr, res->ai_addrlen) == -1) {
printf("Error: connection refused");
sleep(2);
}

sprintf(msg, "Testing");
msg_len = strlen(msg);
send(s, msg, msg_len, 0);

我修复它的方式对我来说似乎很奇怪,而且我不明白它为什么有效。这是固定代码:

int connect_works = -1;
while(connect_works == -1) {
getaddrinfo("127.0.0.1", "1443", &hints, &res);
s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
connect_works = connect(s, res->ai_addr, res->ai_addrlen);

if (connect_works == -1) {
printf("Error: connection refused");
sleep(2);
}
}

sprintf(msg, "Testing");
msg_len = strlen(msg);
send(s, msg, msg_len, 0);

需要说明的是,如果第一次调用 connect() 返回成功,则任一代码段都有效。但是,如果 connect() 失败一次或多次,则只有第二个片段有效。

此外,此错误仅在 Solaris 上编译时出现。在 Ubuntu 上编译时都可以工作。

谁能帮我理解如果 connect() 失败为什么必须重新初始化套接字?

最佳答案

基本原则是您不能重新连接 TCP 套接字。一旦您接受或连接它,即使失败,您也必须关闭它并为新连接创建一个新连接。

关于c++ - connect() 在连接被拒绝时中断套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23205288/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com