通过套接字将数据作为字符串发送的好方法是什么?

时间:2009-12-24 09:49:37

标签: c++ c string sockets

有几种方法可以通过套接字以字符串的形式交换数据,例如:

  • 使用以下功能:

    1. sprintf()sscanf()
    2. snprintf()sscanf()
    3. printf()strtof()
  • 或转换为char然后将其作为数组传递

如果您能提出哪种方式以及为什么它比其他方式更有效率更好,或者如果还有其他方法未提及,我将不胜感激。目前我使用最简单的方法,我的意思是sprintf()sscanf()函数。但我在网上看到,例如使用snprintf()功能更安全。

3 个答案:

答案 0 :(得分:3)

如果只是想发送字符串,你就可以逃避这样的事情;它是一个简单形式的序列化:一个包含以下数据大小的标题..(伪代码)

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 :(得分:1)

在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

答案 2 :(得分:0)

看看Serialization—How to Pack Data

  

发送文本数据非常简单   通过网络,你发现,   但是如果你想发送会发生什么   一些“二进制”数据,如整数或   浮动?事实证明你有一些   选项。

     
      
  1. 使用类似sprintf()的函数将数字转换为文本   发送文字。接收器将解析   使用a将文本重新转换为数字   功能类似于strtol()。
  2.   
  3. 只需发送数据raw,将指针传递给send()。
  4.   
  5. 将数字编码为便携式二进制格式。收件人   将解码它。
  6.