Как я Signify EOF с помощью
1) телнет
2) ЬиЕ в контексте записи (FD, ЬиЕ, BUFSIZE);
Во-первых, это не EOF, который вы хотите сигнализировать. Это «конец сообщения» или «данные, которые вы только что получили, являются полным блоком данных протокола, и вы должны его обработать». И ответ: , однако вы хотите, если обе стороны согласны.
Например, вы можете зарезервировать персонаж ~
специально для того, чтобы пометить конец сообщения. Чтобы указать конец сообщения, одна сторона отправляет номер ~
. Другая сторона знает, что когда она получает ~
, все, что до этого, является единственным сообщением, и все после него является новым сообщением.
Вы также можете отправить длину сообщения до отправки фактического сообщения. Вы можете сделать это в тексте, за которым следует нулевой байт или фид строки. Или вы можете сделать каждое сообщение строкой.
Вы можете сделать это, однако, имеет наибольший смысл в своем конкретном приложении, но вам действительно нужно это сделать.
Есть два случая, когда TCP делает это сделать для вас:
1) Когда сторона полностью осуществляется отправка и знает, с другой стороны не будет посылать больше данных в любом случае, он может использовать close
на сокете. Другая сторона прочтет оставшуюся часть уже отправленных данных, а затем read
вернется 0
.
2) Когда сторона не собирается отправлять больше данных, но другая сторона может отправить больше данных, она может shutdown
своей стороной соединения. Однако он больше не может отправлять данные. Другая сторона узнает об этом завершении работы, и, если это будет специально закодировано, может продолжать отправлять данные до тех пор, пока она не отключит свою половину. Тогда другая сторона read
вернет ноль.(Обратите внимание, что если вы сделаете это с программой, которая не была предназначена для ее принятия, она, вероятно, запутается и не поймет, что она все равно может отправлять вам данные.)
В противном случае все зависит от вас.
Да, он ждет на 'read()', что является блокирующим вызовом. – delicateLatticeworkFever
Как я могу узнать, что это eof? – Derek
Соединение сломается. 'read()' будет возвращать либо -1 (затем проверить 'errno'), либо 0. 0 указывает, что другой конец отключен. – delicateLatticeworkFever