当连接被拒绝时,connect()会中断套接字

时间:2014-04-21 20:20:15

标签: c++ sockets unix solaris

我在我的程序中遇到错误,当我在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()失败时重新初始化套接字?

1 个答案:

答案 0 :(得分:3)

基本原则是您无法重新连接TCP套接字。一旦您接受或连接它,即使出现故障,您也必须关闭它并为新连接创建一个新连接。