Работает ли recv с байтами или октетами, или они одинаковы в контексте документации POSIX? - PullRequest
2 голосов
/ 12 ноября 2011

Чтение ссылки POSIX для сокета send в http://pubs.opengroup.org/onlinepubs/009695399/functions/send.html Интересно, что именно они подразумевают под «байтом» - его традиционное / историческое значение, его подразумеваемое / популярное значение или что-то еще полностью?Я разрабатываю двоичную программу клиент-сервер с сетевым протоколом, поддерживаемую TCP / IP, и я хочу правильно объявить свой буфер, который я использую для передачи в recv, и иметь возможность правильно распаковать его данные.

Да, я знаю, что это почти гипотетическая проблема и, вероятно, шанс из миллиона справиться с реальными проблемами, но я уверен, что это лучше, чем сожалеть.

Итак, парни из POSIX действительно означают октетыили они действительно подразумевают, что для платформ, где, скажем, байт 7 бит, send будет работать с массивами с гранулярностью 7 * N?Или, может быть, он просто будет передавать все данные побитно (размер детализации (7 * n_bytes) бит)?Я имею в виду, поскольку он ожидает void * буфер ...

Какое объявление для моего recv буфера будет наиболее стабильным для архитектур и компиляторов?

Я использую GCC со следующимифлаги (C99, POSIX):

cc -g -Wall -Wextra -std=c99 -pedantic -fexec-charset=ISO-8859-1 -DDEBUG -D_POSIX_C_SOURCE

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

POSIX определяет байт как размер октета и определяет октет как 8 непрерывных битов. Эти определения приведены в главе 3 стандарта POSIX, последний стандарт POSIX (2008) - http://pubs.opengroup.org/onlinepubs/9699919799/

2 голосов
/ 13 ноября 2011

Я считаю, что байт - это тип C char, наименьшее возможное маленькое целое число, содержащее символ, поддерживаемый системой. (возможно, какой-то странный компилятор + целевая система имеют не 8 бит char).

octet означает 8-битный байт.

Если вы думаете о терминах TCP / IP, я полагаю (IIRC), что он определяет различные протоколы в терминах 8-битных байтов. TCP состоит из передачи нескольких 8-битных байтов.

Но на самом деле вас это не должно волновать. Возможно, документирование вашего prococol в терминах битов могло бы помочь. Многое может сделать ваш протокол устаревшим (просто подумайте об IPv6). Если ваш протокол действительно ценный, полезный и хорошо документированный, кто-то сделает его живым и адаптирует его.

...