Неверная запись в память, приводящая к тому, что recv() возвращает ноль

Я как-то отключаюсь от сокета, или, по крайней мере, значение возвращается из recv() это ноль. Из того, что, кажется, вызывает проблему, я думаю, что это запись за пределы памяти. Тем не менее, я вывести значение моего сокета, и это не было повреждено.

Есть ли способ, которым я могу обнаружить "разъединение" без вызова recv() (потому что я уже вызываю это, чтобы прочитать байты, я ищу что-то, что я могу запросить по всему коду, чтобы точно определить, когда происходит "разъединение")?

Это возможно для recv() вернуть ноль из-за недопустимой записи в память, и все же значение дескриптора сокета останется неизменным?

2 ответа

Возвращаемое значение 0 от recv означает EOF, то есть одноранговый узел закрыл свой конец соединения (или, по крайней мере, закрыл его для записи через shutdown). Я не вижу причин полагать, что это должно быть как-то связано с забиванием памяти на вашей стороне; с recv Как правило, будучи очень тонкой оболочкой системного вызова, очень маловероятно, что все, что вы можете сделать в пользовательском пространстве, повлияет на его поведение, даже если ваша программа вызвала неопределенное поведение.

Нет, вы узнаете, что именно произошло на этом сокете, читая / записывая с него / на него. Нет другого (надежного) способа выяснить это.

Возможно ли, чтобы recv() вернул ноль из-за неправильной записи в память, и все же значение дескриптора сокета остается неизменным?

Если что-то пошло не так, recv возвращается -1 и устанавливает errno соответственно (в этом случае EFAULT) скорее, чем 0,

Вы можете проанализировать свою сторону с помощью таких инструментов, как AddressSanitizer или valgrind и Wireshark для сетей.

Другие вопросы по тегам