Чтение меньше, чем написано в сокете - PullRequest
0 голосов
/ 28 мая 2020

Представьте себе TCP-сервер / клиент в C. Представьте:

1) На сервере я записываю в сокет 812 байт;

2) В клиенте я читаю только 512 байт;

3) В клиент, я пишу что угодно.

Что происходит с другими 300 байтами, отправленными сервером? Они перезаписываются?

Кроме того, как я мог прочитать все 812 байтов при размере буфера всего 512? Могу я сделать какую нибудь ал oop? Как узнать, прочитал ли read () все, что отправил сервер?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Что происходит с остальными 300 байтами, отправленными сервером?

Они все еще сидят во внутреннем буфере клиентского сокета, ожидая, пока клиентский код их прочитает.

Они перезаписываются?

Нет.

Кроме того, как я мог прочитать все 812 байт с размером буфера только 512? Могу я сделать что-то вроде al oop?

Да, это именно то, что вам нужно сделать. Вам нужно будет читать из сокета несколько раз, пока не будут прочитаны все 812 байтов. Считывание сообщит вам, сколько байтов он получает каждый раз при вызове.

Как узнать, прочитал ли read () все, что отправил сервер?

Сокет не знает этого. Протокол , который вы реализуете поверх сокета, должен диктовать это. Для TCP существует только 3 варианта:

  1. отправитель может отправить размер данных перед отправкой самих данных. Затем получатель может сначала прочитать размер, а затем продолжить чтение до тех пор, пока не будет получен указанный объем данных.

  2. отправитель может отправить уникальный терминатор после отправки данных. Получатель может продолжать чтение до тех пор, пока не будет получен терминатор.

  3. отправитель может закрыть соединение. Затем приемник может продолжать считывать, пока не будет обнаружено закрытие.

0 голосов
/ 28 мая 2020

Поведение зависит от того, является ли сокет блокирующим или неблокирующим. Блокировка будет ждать, пока не будут получены данные. ОС будет буферизовать определенный объем данных, ожидающих, пока вы его прочитаете, и как только он будет заполнен, сервер либо заблокируется, ожидая, пока буфер освободится, либо вернет ошибку -1 EWOULDBLOCK. Отправленные данные будут ждать, пока клиент их не прочитает. Обычно вы хотите читать al oop, пока не получите то, что вам нужно.

...