1

私はマップを宣言しました:

std::map <std::string, int> mymap;

*vit上記のマップに2 つの値を挿入hit->firstし、ソケット経由で送受信したいと考えてい ます。

私のコード:

for (std::map < int, std::vector < std::string > >::iterator hit = three_highest.begin(); hit != three_highest.end(); ++hit) {

for (std::vector < std::string >::iterator vit = (*hit).second.begin(); vit != (*hit).second.end(); vit++) {
        std::cout << hit->first << ":";
        std::cout << *vit << "\n";
        mymap.insert( std::pair<std::string,int> (*vit,hit->first)); //Is it correct way
       }
    }

//その後、ソケット経由で送信

if ((bytecount = send(*csock, mymap ,  sizeof(mymap), 0)) == -1) { // I think this is wrong, Can someone correct it?
    fprintf(stderr, "Error sending data %d\n", errno);
    goto FINISH;
    }

そして、受信側でこれら2つの変数を取り戻す方法は?

std::map <std::string, int> mymap;
if((bytecount = recv(hsock, mymap, sizeof(mymap), 0))== -1){   //Needs help here also

// getting mymap->first, mymap->second.

        fprintf(stderr, "Error receiving data %d\n", errno);
        }
4

2 に答える 2

2

コメントで述べたように、ポインター、ファイル/ソケットハンドルなどを含むあらゆる種類のデータ構造は、ネットワーク経由で送信したり、ファイルに保存したりできません。少なくとも、マーシャリングシリアライゼーションは一切必要ありません。

あなたの場合、それは半分単純かもしれません。最初に行う必要があるのは、マップのサイズ、つまりマップ内のエントリ数を送信することです。これは、受信側でマップを再作成するのに役立ちます。

次に、最初にすべてのキーを送信し、次にすべての値を送信します。値を送信するのは簡単です。値を に入れ、std::vectoregstd::vector::dataを使用して実際のデータへのポインターを取得するだけです。キーの送信はもう少し複雑です (キーの長さが異なる場合があるため)。キーについては、すべてのキー文字列に収まる十分な大きさの固定サイズの配列の配列を作成し、それを送信することができます。または、受信側で文字列ターミネータをチェックして、各キーを 1 つずつ送信することもできます。または、文字列を 1 つずつ送信します。最初に文字列の長さがあり、その後に実際の文字列が続きます。

于 2013-09-04T09:25:20.937 に答える
2

ソリューションは、キーの後に NUL を送信し、値の後に NUL を送信し、それを最後まで繰り返してから追加の NUL を送信するという単純なものにすることができます。

ただし、マップを自分で反復処理してから、自分で再構築する必要があります。

于 2013-09-04T09:26:08.017 に答える