Почему сокет на принимающем партнере продолжает получать '' бесконечно, когда я использую "control-c", чтобы закрыть сокет на отправляющем партнере

Я новичок в программировании сокетов, я знаю, что это плохая привычка - закрывать сокет с помощью "control-c", но почему сокет на принимающем партнере продолжает получать "" бесконечно после того, как я использую "control-c", чтобы закрыть процесс отправки? Разве сокет на отправляющем узле не должен быть закрыт после "control-c" для выхода из процесса? Спасибо!

2 ответа

Решение

Я знаю, что это плохая привычка - закрывать сокет с помощью "control-c"

Это закрывает весь процесс, а не просто сокет.

почему сокет на принимающем партнере продолжает бесконечно получать '' после того, как я использую "control-c", чтобы закрыть процесс отправки?

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

Разве сокет на отправляющем узле не должен быть закрыт после "control-c" для выхода из процесса?

Это. Весь процесс "закрыт", включая все его ресурсы.

Что касается приемного сокета, вы должны определить условия, при которых он должен быть закрыт, и закрыть его.

Код не указан, но вот обоснованное предположение о том, что может происходить:

  1. У вас есть два отдельных куска кода: отправка и получение
  2. Вы находитесь в процессе передачи данных, когда используете CTL+C для уничтожения отправляющего сокета.
  3. Вы ожидаете, что приемный сокет остановится, но это не так.

Проблема может заключаться в соглашении об окончании передачи. Если отправляющий код запускает End-of-File (EOF) (или прерывает или прекращает работу), когда вы нажимаете CTL+C, то получающий сокет должен увидеть это и прекратить прием. Однако вы не указали, что делает код отправки в тот момент, когда вы нажимаете CTL+C.

Принимающий сокет может просто ждать больше данных; Что касается принимающего кода, то ему нужно было сказать, когда передача будет выполнена, и он терпеливо ждет дополнительной информации.

Вокруг меня гораздо лучшие программисты сокетов, но я думаю, можно с уверенностью сказать, что, как только вы дойдете до этого уровня, вы должны обратить внимание на детали протокола передачи. Если CTL+C просто завершает серверный (отправляющий) код, то клиент не имеет представления, есть ли реальное завершение, неожиданная задержка передачи или серверный процесс только что потерпел неудачу и начнет отправлять снова, как только проясняться.

Если у вас есть какие-либо средства контроля фактических значений, начиная с четвертого, посмотрите, что происходит во время "нормального" завершения передачи данных и CTL+C завершения. Это может помочь вам сосредоточиться на нежелательном поведении.

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