我在我的程序中遇到错误,当我在SIGPIPE
之后尝试send()
时收到信号connect()
。仅当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()
失败时重新初始化套接字?
答案 0 :(得分:3)
基本原则是您无法重新连接TCP套接字。一旦您接受或连接它,即使出现故障,您也必须关闭它并为新连接创建一个新连接。