我正在编写一些涉及使用惯性立方体跟踪器的代码,它主动改变其偏航俯仰和滚动(以度为单位),我需要设置一个服务器来读取该信息以便将信息联网。到目前为止,我已经创建了一个客户端和服务器,但我遇到的问题是要么在一个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 ++的了解并不是很棒,任何帮助都很可爱。谢谢!
答案 0 :(得分:1)
您的代码中存在各种错误。让我们尝试分解并纠正错误观念(我假设您正在使用TCP。)您正在发送一种大小的缓冲区,但可能还有另一种大小的缓冲区。 sizeof(yaw)是一个浮点数,与此浮点数的字符串表示形式的大小不同。
为单个项目调用send / recv很慢。理想情况下,您将定义一个简单的协议。此协议中的消息将是包含您要传输的所有值的字符串。您使用单个send()
发送该消息在您在数据流中读取的接收方,并查找告知您何时收到完整消息的特定标记。然后,您处理该消息,将不同的组件拆分为您的偏航/俯仰/滚动变量。
字符串消息的示例是:"{yaw=1.34;pitch=2.45;roll=5.67}"
然后在客户端上,您不断读取数据缓冲区,直到您到达"}"然后,您可以处理此消息并解析出不同的组件。