Яка найкраща практика для запобігання аварій тут?
Або відключіть вивіски, як усі, або вловлюйте та ігноруйте помилку.
Чи є спосіб перевірити, чи читається інша сторона рядка?
Так, використовуйте select ().
select (), здається, не працює тут, оскільки це завжди говорить, що сокет можна записати.
Вам потрібно вибрати біти для читання . Ви , ймовірно , можете ігнорувати записи біт.
Коли дальній кінець закриє свою обробку файлів, функція Select скаже вам, що є дані, готові прочитати. Перейшовши і прочитавши це, ви отримаєте 0 байтів, і ось як ОС повідомляє вам, що обробка файлу закрита.
Єдиний раз, коли ви не можете ігнорувати біти запису, це якщо ви надсилаєте великі обсяги, і є ризик того, що інший кінець буде відкладений, що може призвести до заповнення ваших буферів. Якщо це трапиться, то спроба запису в ручку файлу може призвести до блокування вашої програми / потоку або відмови. Вибір тестування перед написанням захистить вас від цього, але це не гарантує, що інший кінець є здоровим або що ваші дані надійдуть.
Зауважте, що ви можете отримати підписи з наближення (), а також під час написання.
Закривання видаляє будь-які завантажені дані. Якщо інший кінець уже закритий, закрити не вдасться, і ви отримаєте вивіску.
Якщо ви використовуєте захищений TCPIP, то успішне записування означає, що ваші дані надійдуть у чергу для надсилання, це не означає, що вони надіслані. Поки ви успішно не зателефонували, ви не знаєте, що ваші дані надіслані.
Sigpipe повідомляє вам, що щось пішло не так, не говорить вам, що і що ви з цим робити.