Программирование сокетов Linux с учетом реального размера символа - PullRequest
1 голос
/ 03 марта 2012

Я пишу клиентскую и серверную программу с программированием сокетов Linux.Я запутался в чем-то.Хотя sizeof (char) гарантированно равен 1, я знаю, что реальный размер char может отличаться на разных компьютерах.Это может быть 8 бит, 16 бит или какой-то другой размер.Проблема в том, что если клиент и сервер имеют разный размер символа.Например, размер символа клиента составляет 8 бит, а размер символа сервера - 16 бит.Запись вызова клиента (socket_fd, * c, sizeof (char)) и чтение вызова сервера (socket_fd, * c, sizeof (char)).Клиент отправляет 8 бит, а сервер хочет получить 16 бит?Если это правда, что произойдет?

Еще один вопрос: хорошо ли мне передавать текст между клиентом и сервером, потому что мне не нужно рассматривать проблему с прямым и прямым порядком байтов?1004 * Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 04 марта 2012

@ Базиль прав.Символ всегда восемь бит в Linux.Я нашел это в книге Linux Kernel Development.В этой книге также изложены некоторые другие правила:

  1. Хотя не существует правила, согласно которому тип int должен быть 32-разрядным, он поддерживается в Linux на всех поддерживаемых в настоящее время архитектурах.1007 *

    То же самое относится и к короткому типу, который равен 16 битам на всех современных архитектурах, хотя ни одно из правил явно не разрешает этого.

  2. Никогда не принимайте размер указателя илиlong, который может быть 32 или 64 битами на поддерживаемых в настоящее время машинах в Linux.

  3. Поскольку размер long варьируется на разных архитектурах, никогда не предполагайте, что sizeof (int) равенto sizeof (long).

  4. Аналогично, не думайте, что указатель и int имеют одинаковый размер.

Для выборапередавая двоичные данные или текстовые данные через сеть, книга UNIX Network Programming Volume1 предлагает два решения:

  1. Передавать все числовые данные в виде текстовых строк.

  2. Явно определить двоичные форматыподдерживаемых типов данных (число битов с прямым или прямым порядком байтов) и передавать все данные между клиентом и сервером в этом формате.Пакеты RPC обычно используют эту технику.В RFC 1832 [Srinivasan 1995] описывается стандарт внешнего представления данных (XDR), который используется с пакетом Sun RPC.

1 голос
/ 03 марта 2012

С какой системой вы общаетесь, у которой есть 16 бит в байте? В любом случае, если вы хотите точно знать, сколько у вас битов - используйте int8.

0 голосов
/ 03 марта 2012

Определение c char как размер ячейки памяти отличается от определения, используемого в Unicode.

Кодовая точка Unicode может, в зависимости от используемой кодировки, требовать до 6 байтовхранилища.

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

Простой механизм клиент / сервер - это отправка заголовка фиксированного размера, содержащего длину следующегосообщение.Это хорошее упражнение для создания чего-то подобного в c ...: -)

В зависимости от того, что вы пытаетесь сделать, возможно, стоит взглянуть на существующие технологии интерфейса сообщений;Посмотрите на Etch, Thrift, SWIG, * -rpc, asn1, мыло, XML, JSON, Corba и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...