2016-05-20 2 views
1

Предположим, у меня есть сокет, который я создал системным вызовом socket(). После этого я сделал connect() и начал отправлять и получать данные.Ошибка при отправке()/recv(). Где стоит розетка?

Точно так же, с другой стороны, сокет был создан при помощи системного вызова socket(), а затем bind(), listen() и accept() были названы. Затем эта сторона также начала общаться.

Теперь давайте предположим, что один из send() (и соответственно recv() с другой стороны) терпит неудачу.

Что я хочу, где бы эта розетка стояла после сбоя?

Общаться снова, я должен снова создать сокет и сделать connect() (bind(), listen() и accept() на другой стороне), или я могу попробовать send() и recv() снова? И дополнительно, что лучше всего делать в таком сценарии?

ПРИМЕЧАНИЕ: Мы не знаем, что является причиной send()/recv() на провал. Это может быть что угодно: от физического прорыва провода до другой стороны, отказавшегося (возможно, используя iptables).

ответ

2

Что делать, полностью зависит от того, почему send или recv не удалось.

При обнаружении ошибки, проверьте значение errno, чтобы определить причину. Например, если код ошибки равен EAGAIN, вы снова попытаетесь выполнить операцию, и если код ошибки равен ECONNRESET, вам нужно будет снова подключиться.

Для получения более подробной информации о том, какие ошибки могут быть возвращены, и о том, что вы должны делать с ними, см. Страницы руководства для send и recv.

+0

Тогда восстановление из сломанной сети приведет к проверке всех возвращаемых значений, а затем шагов, которые необходимо предпринять соответственно? – Haris

+0

@Haris Тот, который вы, скорее всего, хотите проверить, это если 'send' возвращает -1 и' errno' является 'ECONNRESET'. Для любого другого значения следует повторить попытку. – dbush

+0

Хорошо. Благодарю. Это помогло. – Haris

 Смежные вопросы

  • Нет связанных вопросов^_^