如何在套接字上发送wstring变量?

时间:2015-12-03 18:18:19

标签: c++ sockets

我必须在C ++中在客户端和服务器之间发送信息。我发现以下代码允许我通过连接发送整数。

服务器:

<link rel="stylesheet" type="text/css" href="/FrontPageCSS.css" />

客户端:

int number = 5;
send(clientSocket, (char*)&number, sizeof(number), 0); //Integer is sent to client

但是,我现在正在尝试使用完全相同的代码发送一个wstring变量(替换&#39; int&#39;使用&#39; wstring&#39;)并且它无法正确发送值。如何在套接字上发送wstring并在客户端上接收它?

2 个答案:

答案 0 :(得分:2)

第1步: 发件人和收件人就共享字符编码达成一致。如果您同时编写发件人和收件人,这很容易。选一个。最好在发送和接收平台上选择一个具有良好C ++支持库的文件。 UTF-8通常有很好的支持。

第2步: 发送者和接收者同意你将如何发出字符串结尾的信号。读取常见选项直到NULL并在发送字符串之前发送字符串的长度。有时您希望以字节为单位发送编码字符串的长度,以便更轻松地读取和缓冲编码字符串。

第3步: 发件人使用商定的编码将字符串编码到char缓冲区中。不幸的是,这在C ++中应该比它应该更加混乱。您可能会发现自己回到第1步并重新选择编码,因为您选择的编码没有您想象的那么好的库支持。

第4步A: 从步骤3写入缓冲区,并在步骤2中选择长度确定方法到套接字中。

步骤4B: 从套接字读取缓冲区,在满足步骤2中选择的终止条件时停止。如果要查找字符串标记的结尾或字符串的数量,则必须读取并缓冲,然后逐字节转换,根据需要读取和缓冲更多。如果您发送了编码字符串的大小,您可以一次读取并缓冲整个字符串,然后让解码器松开。

答案 1 :(得分:0)

要发送C ++类(std::wstring是其示例),您必须序列化:将其转换为可以发送和接收的格式。二进制对象表示(通过获取对象的地址获得)不适合此目的。

幸运的是,序列化std::wstring并不是什么大问题。您只需要使用它的c_str()方法访问它的字符缓冲区。您需要记住的唯一一件事是您还需要告诉接收器字符串的长度 - 以便接收器知道要读取多少。