Серверному сокету на базе C TCP требуется время, чтобы вернуть ошибку 10054. Она возвращается не сразу

#c #multithreading #sockets #tcp

#c #многопоточность #сокеты #tcp

Вопрос:

У меня есть TCP-клиент на базе Linux, написанный на C, и сервер, написанный на c и развернутый на компьютере с Windows.

  1. С сервера я отправляю 1 байт данных каждые 5 секунд.
  2. Клиент получает ее.
  3. После отключения Интернета на клиенте, когда я просматриваю журнал сервера, требуется много времени, чтобы вернуть ошибку 10054 на сервер при отправке.
  4. Это служба Windows с несколькими сокетами и многопоточностью.

что я должен сделать, чтобы немедленно получить ошибку??

Комментарии:

1. Вы ничего не можете сделать, чтобы немедленно получить ошибку. Между вами и получателем существует большая буферизация, что практически гарантирует, что вы не получите сброс соединения при первой отправке после отключения однорангового узла.

2. как мы можем уменьшить эту задержку?? Можно ли это сделать, увеличив или уменьшив временной интервал отправки данных.?

3. Обычный способ обойти это — использовать ping / pong — клиент отправляет ответ, когда он получает данные с сервера. Если клиент не ответил в течение определенного времени, предположите, что он отключен, и закройте соединение.

4. @MrZebra. Сюрприз!!!! элегантного способа справиться с этим условием не существует. Я также планирую отложить время ожидания на стороне сервера.

5. Да, это часть надежности TCP, хотя — если вы снова подключите интернет-соединение, оно будет продолжаться, как будто ничего не произошло

Ответ №1:

вы закрываете соединение на стороне клиента перед отключением Интернета?

Если клиент просто перестанет отвечать на сервер ( After disconnecting internet ), TCP-сокет с обеих сторон закроет соединение после timeout истечения срока действия. Это поведение TCP по умолчанию. timeout Можно изменить, но лучше правильно закрыть соединение и сохранить timeout неизмененный

Комментарии:

1. Если пользователь отключает Интернет на стороне клиента, не имеет никакого значения, закрывает ли он соединение на стороне клиента или нет, и клиент никак не может ответить после отключения Интернета. Ответ не имеет смысла.

2. @Domso . Вы также предлагаете установить тайм-аут на сервере? Я не смог понять ваш ответ

3. @EJP это нормально для задержки после прерывания соединения. (тайм-аут), но это имеет значение, если вы закроете соединение перед отключением Интернета. Если вы действительно хотите уменьшить задержку, вы можете настроить TCP-тайм-аут

4. @Domso Конечно, это имеет значение, но если вы закроете соединение перед отключением Интернета, на самом деле нечего отключать, и вопрос OP не возникает.

5. @EJP да, вот почему я спросил об этом — чтобы уточнить, было ли соединение закрыто или нет. Но вторая часть моего ответа отвечает на его вопрос.