【发布时间】:2019-11-05 20:10:49
【问题描述】:
我正在尝试通过 TCP/IP (Winsock) 从客户端向服务器发送传感器数据(双精度类型)。理论上,连接成功后,我们会执行命令send()。
我使用 2 个变量:stringstream ss 和 string res 来存储传感器数据并将 double 类型转换为 char 类型。但是当我发送数据时,服务器上显示:Date Time Current Voltage Air-Pressure 000000000000000000000000000000000000000…所有数据都是0。
我尝试了其他方法,但服务器只收到空值或不正确的值。请建议我如何解决这个问题。这是我的代码:
char Data_Send[10000];
char item[] = " Date\t" "Time\t" "Current\t" "Voltage\t" "Air-Pressure\t";
string res;
stringstream ss;
strcpy(Data_Send, item);
for (int32 i = 0; i < returnedCount; i = i + channelCount)
{
ss << userDataBuffer[i]; // Sensor data
ss >> res;
strcat(Data_Send, (char*)&res);
}
if (connect(socketClient, (sockaddr*)&clientAddr, sizeof(clientAddr)) == 0)
{
cout << "\nConnection success..!";
cout << "\nConnect with Server's IP: " << inet_ntoa(clientAddr.sin_addr);
cout << "\nStart communicating";
cin.getline(Data_Send, 5120);
send(socketClient, (char*)&Data_Send, sizeof(Data_Send), 0);
}
【问题讨论】:
-
要获取字符串的底层数据使用
c_str,而不是&res- 它获取字符串实例的指针而不是指向其缓冲区的指针,所以strcat(Data_Send, (char*)&res);应该是strcat(Data_Send, res.c_str()); -
发送时使用它的长度,而不是它的
sizeof。并错误检查您的send()呼叫。 -
@rafix07:我按照你的建议试过了,但结果还是和以前一样。
-
你为什么在
send之前打电话给cin.getline(Data_Send, 5120);?getline将覆盖Data_Send中输入的数据。尝试不使用getline发送。还有send(socketClient, (char*)Data_Send, strlen(Data_Send), 0); -
在问你之前,我也删除了那个getline,但结果是一样的。实际上,服务器端的程序是我同事用 Labview 编写的。所以我不确定问题是否是由他的程序引起的。但是他的 Labview 客户端仍然可以得到正确的结果。