- 締切済み
抜け落ちている番号を取得する方法(Winsock利用)
こんにちは。 A→Bというように、 送信端末Aから受信端末Bへパケットを送信する際に、sprintf関数を用いて、各送信パケットに対してナンバリングを行っています。 そして、受信端末において取得することができた番号と抜け落ちている番号を取得したいと思っています。 以下に、プログラムの概要を示します。 [送信側] char send_Buff[1500]; int sequence_Num = 0; //シーケンス番号のカウントアップ sequence_Num++; //sprintf関数にて、文字列格納 sprintf(send_Buff,"%d\0",sequence_Num); sendto関数を使用し、送信 [受信側] recv_Buf[1500]; int x; unsigned int count = 0; recvfrom関数にて送信端末からのパケットを受信し、recv_Bufに格納 count++; //recv_Bufの先頭要素からナル文字までを走査し、ナル文字をみつけたらナル文字の手前の要素までをreceive_seq_Numに格納 for(x=0;recv_Buf[x]!='\0';x++){ receive_seq_Num[count][x] = recv_Buf[x]; } 上記プログラムのように、記述したのですが・・・ [分からない点] 受信側にて、受信することができた各パケットのシーケンス番号のみを配列内に格納したいのですが、上記の記述方法で可能でしょうか? また、配列内に格納したシーケンス番号から抜け落ちているシーケンス番号を割り出したいのですが、どのような記述方法がありますでしょうか? 受信シーケンス番号;1,2,3,4,5,7,10,11,20,21,22・・・ 抜け落ちているシーケンス番号:6,8,9,12,13,14,15,16,17,18,19 ということです。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
No.1 訂正です。 { if (sequenceList[i] == 0 ) ... この番号は漏れている if (sequenceList[i] == 1 ) ... この番号は、あった ここ、番号が存在している場合は、(1 を代入しているので、値が1担っていますね)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
C++ の範囲で、STL という標準コンテナクラスを使うことができれば、map というコンテナを使うと楽ができます。 #include <map> で、 std::map<int, int> sequenceList; など作ります。 これに対して、たとえば、シーケンス No. が、n に入っていれば、 sequenceList[n] = 1; などとして、マークをつけておきます。 最後に、 for(int i = 0; i < maxSequence; i++) { if (sequenceList[i] == 0 ) ... この番号は漏れている if (sequenceList[i] == 0 ) ... この番号は、あった という使い方ができます。 また、シーケンス番号を記録するところで、 sequenceList[n] ++; とすれば、シーケンス番号が出現した回数がカウントできますので、重複のチェックも可能となります。