2

あるcプログラムから別のcプログラムにUDPプロトコルを介してデータを送信しています

データを受信するときに、文字列を処理して関数で使用する場合、関数の終了に時間がかかるために新しいデータを受信する時間がない場合、データがスタックされてから、リアルタイム処理を行うという私の実際の目的である最近のデータを処理する代わりに、古いデータを処理する

誰かがこれで私を助けることができますか?

これは私の受信コードです:

addr_len = sizeof their_addr;
if ((numbytes = recvfrom(sockfd, ubuf, 6 , 0,(struct sockaddr *)&their_addr, &addr_len)) == -1) 
{
    perror("recvfrom");
    //exit(1);
}

inet_ntop(their_addr.ss_family,get_in_addr((struct sockaddr *)&their_addr),s, sizeof s);

//printf("listener: packet is %d bytes long\n", numbytes);

ubuf[numbytes] = '\0';
printf("listener: packet contains \"%s\"\n", ubuf);
4

2 に答える 2

2

リアルタイムを目指している場合は、各パケットの処理にそれほど長い時間を費やすことはできません。

そうすると、常に「遅れて」実行され、基本的に送信されたデータのほとんどが破棄されます。これは、無意味で壊れているように見えます。

それでも、それを解決する1つの方法は、受信データを処理するためのバックグラウンドスレッドを実装し、タイムスタンプを付けて何らかのキューに入れることです。次に、「ワーカー」スレッドはキューからデータをポーリングし、長時間ぶら下がっているパケットを破棄できます。

それでも、それは実際には「リアルタイム」ではありません、それは...奇妙です。

于 2013-03-26T09:08:32.087 に答える
0

ソケットを非ブロッキングモードに変更すると、一度に複数の読み取りを実行して、最後のメッセージを除くすべてのデータを破棄できます。

ただし、読むだけでなく、いくつかのselect呼び出しを使用する必要があります。Win32(Winのコードですか?)には多くのオプションがあります。Linuxにはpollselect多くの不変条件があります。

于 2013-03-26T09:57:38.427 に答える