Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过套接字以字符串形式发送数据的好方法是什么?_C++_C_String_Sockets - Fatal编程技术网

C++ 通过套接字以字符串形式发送数据的好方法是什么?

C++ 通过套接字以字符串形式发送数据的好方法是什么?,c++,c,string,sockets,C++,C,String,Sockets,因为有几种方法可以通过套接字以字符串的形式交换数据,例如: 使用以下函数: sprintf和sscanf snprintf和sscanf printf和strtof 或者转换为char,然后将其作为数组传递 如果您能建议哪种方法以及为什么它比其他方法更有效和更好,或者如果有其他方法没有提到,我将不胜感激。目前我使用的是最简单的方法,我指的是sprintf和sscanf函数。但我在网上看到,例如使用snprintf函数更安全。看一看 发送文本数据很容易 通过网络,你会发现, 但是如果你想发送 一些

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

使用以下函数:

sprintf和sscanf snprintf和sscanf printf和strtof 或者转换为char,然后将其作为数组传递

如果您能建议哪种方法以及为什么它比其他方法更有效和更好,或者如果有其他方法没有提到,我将不胜感激。目前我使用的是最简单的方法,我指的是sprintf和sscanf函数。但我在网上看到,例如使用snprintf函数更安全。

看一看

发送文本数据很容易 通过网络,你会发现, 但是如果你想发送 一些二进制数据,如int或 花车?原来你有一些 选项

使用类似sprintf的函数将数字转换为文本,然后 发送文本。接收者将解析 使用 功能类似于strtol。 只需发送原始数据,传递指向要发送的数据的指针。 将数字编码成可移植的二进制形式。接受者 我将解码它。 看一看

发送文本数据很容易 通过网络,你会发现, 但是如果你想发送 一些二进制数据,如int或 花车?原来你有一些 选项

使用类似sprintf的函数将数字转换为文本,然后 发送文本。接收者将解析 使用 功能类似于strtol。 只需发送原始数据,传递指向要发送的数据的指针。 将数字编码成可移植的二进制形式。接受者 我将解码它。 在C++中,你也可以使用< /P> 然后可以使用ss.str.c_str提取字符串

ss.str.c_str将导致上述情况

一,;1.0

C++中也可以使用

然后可以使用ss.str.c_str提取字符串

ss.str.c_str将导致上述情况

一,;1.0

如果你只想发送字符串,你可以这样做;它以一种简单的形式进行序列化:一个包含以下数据大小的头。。伪码

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() );
}
如果你只想发送字符串,你可以这样做;它以一种简单的形式进行序列化:一个包含以下数据大小的头。。伪码

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() );
}


我一直想说:这不应该是社区维基-很抱歉我不知道维基的作用是什么。那么请解释什么时候参考社区维基而不是一般来说,那些主观的、没有单一正确答案的问题应该是维基。请注意,你在回答维基问题方面没有任何声誉。不过你可以拿到徽章。谢谢,也很抱歉给你带来了问题。我一直想说:这不应该是社区维基-很抱歉我不知道维基的作用是什么。那么请解释什么时候参考社区维基而不是一般来说,那些主观的、没有单一正确答案的问题应该是维基。请注意,你在回答维基问题方面没有任何声誉。不过你可以拿到徽章。谢谢,很抱歉给你带来了问题谢谢你的回复。对于二进制,这没有问题,因为我使用的是谷歌的协议缓冲区,因为在不同的操作系统之间进行交换。那么,你是说使用sprintf和strtol足够好吗?@mk,可能有点慢,但在我看来这不是一个坏的选择。我很困惑——这个问题与通过套接字发送协议缓冲区消息有关吗?如果是这样,您不是在使用提供的IO类进行编码/解码吗@因此,不,它不是关于以二进制模式发送数据,而是以字符串ASCII。。。谢谢回复@Nick D,那么在ASCII模式下我指的最快方式是什么?谢谢谢谢你的回复。对于二进制,这没有问题,因为我使用的是谷歌的协议缓冲区,因为在不同的操作系统之间进行交换。那么,你是说使用sprintf和strtol足够好吗?@mk,可能有点慢,但在我看来这不是一个坏的选择。我很困惑——这个问题与通过套接字发送协议缓冲区消息有关吗?如果是这样,您不是在使用提供的IO类进行编码/解码吗@因此,不,它不是关于以二进制模式发送数据,而是以字符串ASCII。。。谢谢回复@Nick D,那么在ASCII模式下我指的最快方式是什么?谢谢谢谢你的回复,这很有趣。在不同操作系统之间进行通信时,这是否有效?谢谢!事实上,我在网上读到,使用stringstream是无用的,再次感谢你的帮助。作者的论点主要集中在具体案例上,我在过去的项目中广泛使用了stringstream,发现它们根本没有用处。但这完全是主观的
ue:-谢谢你的回复,这很有趣。在不同操作系统之间进行通信时,这是否有效?谢谢!事实上,我在网上读到,使用stringstream是无用的,再次感谢你的帮助。作者的论点主要集中在具体案例上,我在过去的项目中广泛使用了stringstream,发现它们根本没有用处。但这是一个完全主观的问题:-执行两次发送意味着将发送两个数据包。您最好使用一些分散-聚集机制,将所有数据发送到一个数据包中。我假设您正在使用TCPhere@deus-ex-machina399:只有在套接字上设置了TCP_节点延迟标志时才可以。你们都是对的;我自己也使用类似的代码,我确实保留了一个额外的缓冲区,在其中创建单个数据包,因为我在几个项目中使用了TCP_NODELAY,其中许多非常小的数据包必须以相当高的速率发送。这个问题与选择无关……而是与如何以字符串ASCII模式发送数据有关。但为什么你是2倍发送和接收?如果没有收到数据,则不会执行第二次发送,对吗?如果只发送字符串,远程端事先不知道字符串有多大,换句话说,接收器必须预先分配足够的数据或分块接收。为了解决这个问题,我的示例首先发送数据的大小,然后发送数据本身。现在,从你在这里的回答中,我开始认为你的问题实际上是关于转换到字符串或从字符串转换到字符串,与数据的发送方式无关,对吗?在这种情况下,问题与套接字无关。也许可以提供一个您正试图实现的hat示例。执行两次发送意味着将发送两个数据包。您最好使用一些分散-聚集机制,将所有数据发送到一个数据包中。我假设您正在使用TCPhere@deus-ex-machina399:只有在套接字上设置了TCP_节点延迟标志时才可以。你们都是对的;我自己也使用类似的代码,我确实保留了一个额外的缓冲区,在其中创建单个数据包,因为我在几个项目中使用了TCP_NODELAY,其中许多非常小的数据包必须以相当高的速率发送。这个问题与选择无关……而是与如何以字符串ASCII模式发送数据有关。但为什么你是2倍发送和接收?如果没有收到数据,则不会执行第二次发送,对吗?如果只发送字符串,远程端事先不知道字符串有多大,换句话说,接收器必须预先分配足够的数据或分块接收。为了解决这个问题,我的示例首先发送数据的大小,然后发送数据本身。现在,从你在这里的回答中,我开始认为你的问题实际上是关于转换到字符串或从字符串转换到字符串,与数据的发送方式无关,对吗?在这种情况下,问题与套接字无关。也许可以举一个你想要达到的目标的例子。