Считайте меня новичком в плане программирования сокетов.Как сообщает сокет TCP/IP, что внешний хост закрыл соединение?
Предположим, я использую Telnet для подключения к веб-серверу:
# telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET/
(blah blah blah)
connection closed by foreign host.
Мой вопрос что касается написания приложения, чтобы сделать то же самое. В принципе, я пишу Perl. Но я не думаю, что это особый вопрос Perl.
В Perl я создаю сокет, используя IO :: Socket :: INET, который расширяет IO :: Handle. По сути, сокет имеет те же свойства, что и дескриптор файла, который, как я понимаю, является определением «сокета» в unix-неразличимом от дескриптора файла.
Мое приложение предназначено для сопоставления функций telnet, описанных выше. Я открываю сокет и записываю строку «GET/\ n \ n» и получаю точно такие же результаты, за исключением «соединения, закрытого иностранным хостом». Фактически все свойства сокета выглядят неизменными.
Мой вопрос: В Perl или как-то иначе, как я могу запросить свойства сокета для определения результата, сообщенного через telnet. То есть, как я могу определить, что внешний хост закрыл соединение?
Как правило, результат 'select' или' read' будет сообщать вам, что происходит с сокетом, включая это условие. –
Как отметил @LightnessRacesinOrbit, вы пытаетесь прочитать и поймать исключение или errno. По моему опыту, я всегда получаю SIGPIPE, когда пульт закрывает сокет, пока я пытаюсь его прочитать. – alvits
@alvits Нет, нет. Это происходит только при * письме * или при чтении, если вы ранее писали, пока сверстник уже закрылся, или если пэр закрыл аборт по какой-то другой причине. Обычно вы получаете однозначную индикацию конца потока из потока. То, что это точно зависит от того, какой API вы используете, но не включает SIGPIPE. – EJP