Я боролся с ошибкой в своей программе, где получил сигнал 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()
терпит неудачу?
Основной принцип заключается в том, что вы не можете повторно подключить TCP-сокет. После того, как вы приняли или подключили его, даже с отказом, вы должны закрыть его и создать новый для новых подключений.