Read () в C / C ++ - относительно того, что читается против размера буфера

0

Я пытаюсь прочитать сообщение (строка/текст) с сервера, и я установил размер буфера очень большой (buffer_size = 1000), так что мне нужно только один раз прочитать его с сервера.

Поэтому мой вопрос заключается в том, что сообщение составляет ровно 10 байт, и я вызываю read (socket, buffer, buffer_size), тогда он будет читать только 10 байт, так как он меньше фактического размера буфера? Наверное, мне просто интересно узнать о поведении вызова в случае, если прочитанное на самом деле не такое, как ожидалось.

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

Теги:
sockets
client-server

3 ответа

2
Лучший ответ

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

Продолжайте читать до тех пор, пока у вас не будет достаточно байтов или не будет прочитано значение 0 (что означает EOF).

Если чтение получает N байтов, и этого недостаточно, тогда вам нужно выпустить еще один буфер таргетинга на чтение + N.

  • 0
    Спасибо! Это очень помогает!
1

Пожалуйста, прочитайте прочитанного

Начиная с

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

Ну, прочитанный перезапишет бафф, но не отправится в пустой буфер для вас, вы должны сделать это сами.

0

Функция read(int fd, void *buffer, size_t count) будет считывать до count байтов из файлового дескриптора fd в buffer, поэтому, если для чтения всего 10 bytes оно будет читать только 10 bytes. И нет, он не будет пустым buffer и перезаписать его содержимое, он просто перезапишет байты, считанные из дескриптора файла.

  • 0
    Спасибо! Еще один вопрос: если вызов чтения / записи не читает / записывает столько байтов, сколько требуется, как я могу прочитать / записать оставшиеся байты? Я где-то читал, что просто снова вызываю read / write, и он сделает эту работу. Это правильно?
  • 0
    да, вы вызываете его до тех пор, пока он не вернет 0 (что означает отсутствие данных для чтения) или ошибку.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню