Что такое хороший способ отправки данных в виде строк через сокеты? - PullRequest
1 голос
/ 24 декабря 2009

Так как существует несколько способов обмена данными в виде строк через сокеты, например:

  • с использованием таких функций, как:

    1. sprintf() и sscanf()
    2. snprintf() и sscanf()
    3. printf() и strtof()
  • или преобразование в char, а затем передача его в виде массива

Буду признателен, если вы подскажете, какой путь и почему он эффективнее и лучше других, или есть другой способ, не упомянутый выше На данный момент я использую самый простой способ, я имею в виду функции sprintf() и sscanf(). Но я читал в Интернете, например, использование функции snprintf() более безопасно.

Ответы [ 3 ]

3 голосов
/ 24 декабря 2009

если вы просто хотите отправить строки, вы можете получить что-то подобное; это сериализация в простой форме: заголовок, содержащий размер следующих данных (псевдокод)

Send( socket, const string& str )
{
  const size_t len = str.length();
  send( socket, &len, sizeof( len ) );
  send( socket, str.data(), len );
}

Receive( socket, string& str )
{
  size_t len;
  receive( socket, &len, sizeof( len ) );
  str.resize( len );
  receive( socket, str.data(), len );
}

Изменить: см. Комментарий 1, более быстрый способ отправки будет

Send( socket, const string& str, rawmemory& packet )
{
  const size_t len = str.length();
  packet.Reserve( len + sizeof( len ) );
  packet.ResetOffset();
  packet.CopyFrom( &len, sizeof( len ) );
  packet.CopyFrom( str.data(), len );
  send( socket, packet.Data(), packet.Length() );
}
1 голос
/ 24 декабря 2009

в C ++ вы также можете использовать StringStream

stringstream ss;
 int i = 1;
 float f = "1.0";
 char separtor = ';';

 ss << i << separtor  << f;

затем вы можете извлечь строку с помощью ss.str().c_str()

ss.str().c_str() приведет к описанному выше случаю с

"

1; 1,0

"

0 голосов
/ 24 декабря 2009

Посмотрите на Сериализация - как упаковать данные .

Достаточно просто отправить текстовые данные по сети, вы находите, но что произойдет, если вы хотите отправить некоторые "двоичные" данные, такие как целые или поплавки? Оказывается, у вас есть несколько опции.

  1. Преобразуйте число в текст с помощью функции, подобной sprintf (), затем отправь текст. Приемник будет разбирать текст обратно в число с помощью работает как strtol ().
  2. Просто отправьте необработанные данные, передав указатель на данные для отправки ().
  3. Кодирование числа в переносимую двоичную форму. Получатель расшифрует его.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...