私はC++ソケットプログラミングの初心者です。私はしばらくの間処理しようとしているという問題があります。C++多重UDPソケットデータ処理
私の仕事は、2つの異なるセンサーから受信したデータを処理することです。私はUDPソケットを介してデータを受信し、パケットを処理します(明らかにすべてがwhileループで発生します)。リアルタイムのビジュアライゼーションにデータを使用するので、プロセス全体を迅速にする必要があります。
1つのセンサーからデータを受信しようとしても、すべて正常です。私は2つのセンサー(そして1つのループ内に2つのrecvfrom()関数がある)でそれをやりたいとき、ここで問題が始まる。処理が本当に遅く、結果的に私はいくつかのパケットを見逃しています。私は、recvfrom()関数がブロッキング呼び出しであり、select()関数で処理したことを認識しています。したがって、問題の原因ではありません。ここで
は騒ぎの責任であると考えられるコードの一部です:私は2番目SingleSocketReceiver()関数をコメントすると
while (1)
{
SingleSocketReceiver(&socket_1, port_1, scene_1, ptrScene_1, model);
SingleSocketReceiver(&socket_2, port_2, scene_2, ptrScene_2, model);
}
、すべてが正常に動作します。ここ
とはSingleSocketReceiver()関数が構成されているもの:誰かが本当の問題が何であるか提案する場合
int SingleSocketReceiver(UDPsocket* socket, uint16_t port,pcl::PointCloud<pcl::PointXYZ> scene, pcl::PointCloud<pcl::PointXYZ>::Ptr ptrScene, pcl::PointCloud<pcl::PointXYZ>::Ptr model)
{
struct timeval tv;
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(socket->pSocket,&rfds);
tv.tv_sec = 1;
tv.tv_usec = 0;
if ((socket->rc = select(FD_SETSIZE,&rfds,NULL,NULL,&tv)) < 0)
{
printf("Port No. %d: ERROR! - no data received!\n", port);
return RESULT_ERROR;
}
else if (socket->rc == 0)
{
printf("Port No. %d: Timeout - no data received!\n", port);
return RESULT_ERROR;
}
socket->rc=recvfrom(socket->pSocket,(char*)socket->udpPacketBuf,UDP_PACKET_BUF_LEN,0,&socket->remoteAddr,&socket->remoteAddrLen);
if(socket->rc==SOCKET_ERROR)
{
printf("Socket for port No.%d: Error in recvfrom\n", port);
return RESULT_ERROR;
}
else
{
// Check the packet counter for missing packets
if (socket->previous_packet_counter_valid)
{
if ((socket->ph->PacketCounter - socket->previous_packet_counter) != 1)
{
printf("Port No.%d: Packet Counter jumped from %u to %u (missing packets; try to redirect output)\n", port, socket->previous_packet_counter, socket->ph->PacketCounter);
socket->startOfChannelFound = 0;
}
}
socket->previous_packet_counter = socket->ph->PacketCounter;
socket->previous_packet_counter_valid = 1;
// is this the channel with our data?
if (socket->ph->ChannelID == socket->customerDataChannel)
{
if (socket->ph->IndexOfPacketInChannel == 0)
{
socket->startOfChannelFound = 1;
if (socket->channel_buf_size == 0)
{
socket->channel_buf_size = socket->ph->TotalLengthOfChannel;
socket->channelBuf = (int8_t*) malloc(socket->channel_buf_size);
}
// as we reuse the buffer we clear it at the beginning of a transmission
memset(socket->channelBuf, 0, socket->channel_buf_size);
socket->pos_in_channel = 0;
}
if (socket->startOfChannelFound)
{
processPacket(socket->udpPacketBuf, socket->rc, socket->channelBuf, socket->channel_buf_size, &socket->pos_in_channel);
if (socket->ph->IndexOfPacketInChannel == socket->ph->NumberOfPacketsInChannel -1)
{
processChannel8(socket->channelBuf, socket->pos_in_channel);
displayData();
createPointCloud(scene, ptrScene, model);
}
}
}
}
return RESULT_OK;
}
を私は非常に感謝されるとそれを処理する方法は何か。残念ながら、自分の仕事のためにソースコード全体を表示することはできません。私はそれを公に発表することはできません。
この分野の知識が不足していることを私に許してください。私は喜んですべての追加の質問に答えるだろう。
ありがとうございます。これは助け:) – nanasable