Intereting Posts
Android NDK socket connect () возвращает 0, когда он должен сработать, пока на 3g JNI Android – Преобразование char * в байтовый массив и возврат его в java C Массивный цикл Как вы можете отслеживать ввод мыши с использованием наименьших библиотек в c Процесс Эрланга висит, когда он пытается убить себя Самый короткий пример использования функции templating в C? Как читать текстовый файл до определенной позиции в C? Как заблокировать системный вызов чтения Есть ли разница между битрейтом по константе в сравнении с битрейтом переменной с тем же значением, в C? Calloc для массива массива с отрицательным индексом в C вызов по значению-результату? Попытка реализовать параллельный TCP-сервер и клиент в c Malloc – структура в определенной точке памяти? Сколько уровней оптимизации GCC существует? Требуется ли мьютекс, когда только inc / декрементирует переменную?

Как создать буфер для чтения данных сокета в C

Использование программирования сокетов C / C ++ и метод «read (socket, buffer, BUFSIZE)». Что такое «буфер», я знаю, что char и byte – это одно и то же, но имеет ли значение, сколько элементов имеет массив байтов? Должен ли буфер иметь возможность удерживать все сообщение до нулевого символа?

BUFSIZE должен быть равен размеру вашего буфера в байтах. read () прекратит чтение, когда буфер заполнен. Вот пример:

#define MY_BUFFER_SIZE 1024 char mybuffer[MY_BUFFER_SIZE]; int nBytes = read(sck, mybuffer, MY_BUFFER_SIZE); 

Как всегда, используйте sizeof когда у вас есть шанс. Используя встроенный оператор sizeof , вы просите компилятор вычислить размер переменной, а не указывать ее самостоятельно. Это снижает риск появления ошибок, когда размер фактической переменной отличается от того, что вы думаете.

Итак, вместо того, чтобы делать

 #define BUFSIZE 1500 char buffer[BUFSIZE]; int n = read(sock, buffer, BUFSIZE); 

вы действительно должны использовать

 char buffer[1500]; int n = read(sock, buffer, sizeof buffer); 

Обратите внимание, как вам не нужна скобка вокруг аргумента sizeof, если аргумент не является именем типа.

Для реализации ваших сокетов не требуется буфера, чтобы быть достаточно большим, чтобы наверняка содержать все сообщение, но это может быть удобно в зависимости от того, что вы делаете.