Неверная запись в память, приводящая к тому, что recv() возвращает ноль
Я как-то отключаюсь от сокета, или, по крайней мере, значение возвращается из recv()
это ноль. Из того, что, кажется, вызывает проблему, я думаю, что это запись за пределы памяти. Тем не менее, я вывести значение моего сокета, и это не было повреждено.
Есть ли способ, которым я могу обнаружить "разъединение" без вызова recv() (потому что я уже вызываю это, чтобы прочитать байты, я ищу что-то, что я могу запросить по всему коду, чтобы точно определить, когда происходит "разъединение")?
Это возможно для recv()
вернуть ноль из-за недопустимой записи в память, и все же значение дескриптора сокета останется неизменным?
2 ответа
Возвращаемое значение 0 от recv
означает EOF, то есть одноранговый узел закрыл свой конец соединения (или, по крайней мере, закрыл его для записи через shutdown
). Я не вижу причин полагать, что это должно быть как-то связано с забиванием памяти на вашей стороне; с recv
Как правило, будучи очень тонкой оболочкой системного вызова, очень маловероятно, что все, что вы можете сделать в пользовательском пространстве, повлияет на его поведение, даже если ваша программа вызвала неопределенное поведение.
Нет, вы узнаете, что именно произошло на этом сокете, читая / записывая с него / на него. Нет другого (надежного) способа выяснить это.
Возможно ли, чтобы recv() вернул ноль из-за неправильной записи в память, и все же значение дескриптора сокета остается неизменным?
Если что-то пошло не так, recv
возвращается -1
и устанавливает errno
соответственно (в этом случае EFAULT
) скорее, чем 0
,
Вы можете проанализировать свою сторону с помощью таких инструментов, как AddressSanitizer или valgrind и Wireshark для сетей.