【发布时间】:2015-02-23 12:59:34
【问题描述】:
我有一个客户端-服务器应用程序,服务器部分用 C++ (Winsock) 编写,客户端部分用 Java 编写。
当从客户端发送数据时,我首先发送它的长度,然后是实际数据。发送长度,代码如下:
clientSender.print(text.length());
其中clientSender 的类型为PrintWriter。
在服务器端,读取这个的代码是
int iDataLength;
if(recv(client, (char *)&iDataLength, sizeof(iDataLength), 0) != SOCKET_ERROR)
//do something
我尝试在if 中打印iDataLength 的值,结果它总是一个随机的大整数。如果我将iDataLength 的类型更改为char,我会得到正确的值。但是,实际值很可能超过char 的容量。
在 C++ 中读取通过套接字传递的整数的正确方法是什么?
【问题讨论】:
-
简单解释 - 使用具有明确的逐字节表示的协议,以便字节序、对齐、传递等无关紧要,并且始终有效。
-
我认为您正在尝试将数字的文本表示直接转换为
int。也许将其读入字符缓冲区,然后使用std::stoi()之类的东西。这是PrintWriter对您的int所做的:docs.oracle.com/javase/7/docs/api/java/io/… “String.valueOf(int) 生成的字符串被转换为字节”。 -
您需要将其从平台端转换为网络端。然后您需要确保您发送的任何数据在另一侧具有相同的大小。在那里你转换回平台端。这并不像看起来那么容易。最好使用 JSON 之类的文本协议。
标签: c++ windows sockets types winsock