Winsock 2,将变量压缩成一个字符串,将其发送出去,然后接收它并将其读回

时间:2017-12-14 15:04:23

标签: c++ networking buffer winsock2

我正在编写一些涉及使用惯性立方体跟踪器的代码,它主动改变其偏航俯仰和滚动(以度为单位),我需要设置一个服务器来读取该信息以便将信息联网。到目前为止,我已经创建了一个客户端和服务器,但我遇到的问题是要么在一个chunck中发送信息,然后将其读回三个并打印它,或者指定哪个发送匹配哪个接收。

if( currentTrackerH > 0 )
            {
                int iSendResult1;
                int iSendResult2;
                int iSendResult3;

                char EulerBuffer0[64];
                char EulerBuffer1[64];
                char EulerBuffer2[64];


                showStationData( currentTrackerH, &TrackerInfo,
                                 &Stations[station-1], &data.Station[station-1],
                                 &StationsHwInfo[currentTrackerH-1][station-1],
                                 showTemp);
                //send to the server 
                do{
                sprintf(EulerBuffer0, "%f", data.Station[station-1].Euler[0]);
                iSendResult1= send(Connection, EulerBuffer0, sizeof(data.Station[station-1].Euler[0]), NULL);

                sprintf(EulerBuffer1, "%f", data.Station[station-1].Euler[1]);
                iSendResult2= send(Connection, EulerBuffer1, sizeof(data.Station[station-1].Euler[1]), NULL);

                sprintf(EulerBuffer2, "%f", data.Station[station-1].Euler[2]);
                iSendResult3= send(Connection, EulerBuffer2, sizeof(data.Station[station-1].Euler[2]), NULL);
                }while ((iSendResult1 || iSendResult2 || iSendResult3)>0);
                //shutdown the socket when there is no more data to send    
                iSendResult1 = shutdown(Connection, SD_SEND);
                if (iSendResult1 == SOCKET_ERROR) 
                {
                    printf("shutdown failed with error: %d\n", WSAGetLastError());
                    closesocket(Connection);
                    WSACleanup();
                    return 1;
                }
            }
        }

这是我的客户端,在这里我将把我的服务器端。网络连接和我的跟踪器代码工作正常,但发送和接收是它所有变得困难的地方。

//begin recieving data
char yaw[256];
char pitch[256];
char roll[256];

int iResult1;
int iResult2;
int iResult3;

float fyaw, fpitch, froll;

do{
    do {    
    iResult1= recv(newConnection, yaw,sizeof(yaw),NULL);
    } while( iResult1 == 0 );

    fyaw = atof(yaw);

    do {    
    iResult2= recv(newConnection, pitch,sizeof(pitch),NULL);
    } while( iResult1 == 0 );

    fpitch = atof(pitch);

    do {    
    iResult3= recv(newConnection, roll,sizeof(roll),NULL);
    } while( iResult1 == 0 );

    froll = atof(roll);

    printf("(%f,%f,%f)deg \n",
                fyaw, fpitch, froll);
}while(1);

我对c ++的了解并不是很棒,任何帮助都很可爱。谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码中存在各种错误。让我们尝试分解并纠正错误观念(我假设您正在使用TCP。)您正在发送一种大小的缓冲区,但可能还有另一种大小的缓冲区。 sizeof(yaw)是一个浮点数,与此浮点数的字符串表示形式的大小不同。

为单个项目调用send / recv很慢。理想情况下,您将定义一个简单的协议。此协议中的消息将是包含您要传输的所有值的字符串。您使用单个send()发送该消息在您在数据流中读取的接收方,并查找告知您何时收到完整消息的特定标记。然后,您处理该消息,将不同的组件拆分为您的偏航/俯仰/滚动变量。

字符串消息的示例是:"{yaw=1.34;pitch=2.45;roll=5.67}"

然后在客户端上,您不断读取数据缓冲区,直到您到达"}"然后,您可以处理此消息并解析出不同的组件。