【问题标题】:How to send double-type data via TCP/IP Winsock如何通过 TCP/IP Winsock 发送双类型数据
【发布时间】: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,而不是&amp;res - 它获取字符串实例的指针而不是指向其缓冲区的指针,所以strcat(Data_Send, (char*)&amp;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 客户端仍然可以得到正确的结果。

标签: c++ sockets tcp winsock


【解决方案1】:

我强烈建议您不要通过网络发送浮点数据。而不是这个发送这个值的整数表示。

但如果你真的想这样做,更好的方法是以已知格式发送数据的二进制表示(例如IEEE 754)。

例如,您可以这样做:

send(socketClient, (void*)&userDataBuffer[i], sizeof(double), 0); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2015-11-01
    • 2015-08-25
    • 2020-12-03
    相关资源
    最近更新 更多