В моем клиентском коде я выполняю следующие шаги для подключения к сокету:
Создание сокета
sockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
Подключение (повторите попытку в течение времени 'x' в случае сбоя)
connect(sockDesc, (sockaddr *) &destAddr, sizeof(destAddr))
(после заполнения полей destAddr
)
Использование сокета для операции send()
/ recv()
:
send(sockDesc, buffer, bufferLen, 0)
recv(sockDesc, buffer, bufferLen, 0)
close()
дескриптор сокета и выход
close(sockDesc)
Если во время send()
/ recv()
соединение разрывается, я обнаружил, что могу подключиться, вернувшись к шагу 2.
Это решение хорошо? я должен закрыть дескриптор сокета и вернуться к шагу 1?
Другое интересное наблюдение, которое я не могу понять, это когда
Я останавливаю свой эхо-сервер и запускаю клиент. Я создаю сокет (шаг 1) и вызываю connect()
, что не удается (как и ожидалось), но затем я продолжаю звонить connect()
, скажем, 10 раз. После 5 попыток я запускаю сервер, и connect()
успешно. Но во время вызова send()
он получает ошибку SIGPIPE
. Я хотел бы знать:
1) Нужно ли создавать новый сокет каждый раз, когда connect()
выходит из строя? Насколько я понимаю, пока я не выполнил send()
/ recv()
для сокета, он так же хорош, как новый, и я могу повторно использовать тот же fd
для вызова connect()
.
2) Я не понимаю, почему SIGPIPE
получено при работающем сервере и connect()
успешно.