2017-02-05 13 views
4

Допустим, что мы создали гнездо с socket(), затем мы использовали bind() и listen(). Затем мы используем accept() для ожидания запросов клиентов после подключения клиента, если мы завершим работу сервера (например, ctrl + c процесс).Некоторые вопросы о сокетах и ​​accept()

  1. Подключен ли клиент к порту?
  2. Можем ли мы каким-то образом восстановить соединение с розеткой?
  3. Является ли это проблемой на стороне клиента? Или recvfrom() ждать, пока кто-то вернется в сокет?

ответ

3

Я собираюсь предположить, что вы используете TCP.

Если завершение работы сервера:

  1. ли клиент все еще подключен к порту?

    Нет. Операционная система на стороне сервера заметила, что сервер завершил соединение и будет закрыт соединение, отправив пакет клиенту, который завершает соединение. Даже если этого не происходит (например, сеть не работает), соединение больше не может быть использовано, и в первый раз, когда клиент что-то отправит, он поймет, что соединение было потеряно. Некоторые программы используют TCP Keep-Alive или посылают сообщения о сердцебиении, чтобы убедиться, что они замечают, что сервер уходит.

  2. Можем ли мы каким-либо образом восстановить соединение с розеткой?

    Нет. Клиенту необходимо установить новое соединение.

  3. Является ли это проблемой на стороне клиента? Или recvfrom() ждет, когда кто-то вернется в сокет?

    recvfrom() не ждет таким образом. Сервер не может «повторно подключиться» или «переподтвердить» так, как вы подразумеваете. Клиент должен будет отреагировать на отключение путем явного повторного подключения.

+0

Он использует 'listen()' и 'accept()'. Не требуется никаких предположений. – EJP

+2

Благодарим вас за информацию и время, проведенное вами. –

+0

@EJP: OP может использовать SCTP, например: https://linux.die.net/man/7/sctp - он использует те же функции, что и TCP. Очевидно, что TCP скорее всего, но это действительно предположение. –

2

ли клиент все еще подключен к порту?

Клиент будет получать сброс соединения при чтении в Windows или EOS при чтении в * nix или при перезагрузке соединения при записи.

Можем ли мы как-то восстановить соединение с розеткой?

К порт. Клиент может попытаться повторно подключиться, но это не удастся, пока сервер не запустится и не прослушивается. После перезагрузки сервер ничего не сможет с этим поделать.

Является ли этот клиент проблемой на стороне клиента?

Да, см. Выше.

Или recvfrom() Ждать, если кто-то свяжется с розеткой?

Наверняка нет.

NB Вы должны использовать recv() для потоковых сокетов. Вам не нужна информация об исходном адресе recvfrom() дает вам, если это действительно так, потому что она уже доступна через getpeername() на сокете.

+3

Большое спасибо за потраченное время и предоставленную информацию. –

+2

@MakisMandrelas Спасибо за благодарность. Редко можно получить их здесь, к сожалению, и еще реже для любого, кто признает время ответа респондентов на ответ. Ваша любезность с Джоном и мной очень ценится. – EJP