connect () разрывает сокет, когда в соединении отказано

0

Я боролся с ошибкой в своей программе, где получил сигнал 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
    Хотя я понятия не имею, зачем вам нужно создавать новый сокет, возможно, вам следует закрыть () сокет, когда connect () не удается ... В противном случае вы пропускаете сокеты.
  • 0
    Где назначен номер исходящего порта? Это часть socket () или connect ()? Возможно ли существование сокетов без назначения номеров исходящих портов?
Показать ещё 2 комментария
Теги:
sockets
solaris

1 ответ

3
Лучший ответ

Основной принцип заключается в том, что вы не можете повторно подключить TCP-сокет. После того, как вы приняли или подключили его, даже с отказом, вы должны закрыть его и создать новый для новых подключений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню