-2

私の以下のコードでは、ソケット経由で送信hit->firstしたい:*vit

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

    for (std::vector < std::string >::iterator vit = (*hit).second.begin(); vit != (*hit).second.end(); vit++) {
        std::cout << hit->first << ":";
        std::cout << *vit << "\n";

結果:

2:one
3:ff
3:rr
6:fg

つまり、出現:単語

ソケットで send() メソッドを使用してこれを送信したい。両方だった場合、intまたはその場合、charそれを 2 次元配列に格納して、その配列を送信できます。しかし、ここではそうではありません。

シングルsend()インソケットを使用してこれを送信する方法を理解できる人はいますか?

4

2 に答える 2

2

int と char 配列を保持するデータ構造を定義してみませんか (char 配列を定義するには、最大値を知る必要があります)。次に、このデータ構造の配列を渡すことができます。代わりに、おそらくもっとコンパクトに、LV (Length Value format) を使用できます。したがって、5:2:one::4:3:ff を持つことができます。これは、実際の発生:単語が続く発生:単語の num_of_char です。このメッセージを作成して、1 回の send() 呼び出しで送信できます。

于 2013-09-03T18:15:53.240 に答える
2

を介してメッセージを文字列にパックし、メッセージstringstreamを送信できます (文字列の長さを前に付けます)。反対側は文字列の長さを読み取り、そのバイト数を文字列に読み取ります。この文字列を に入力してstringstream、データを抽出できます。

疑似的なコードでは、送信は次のようになります。

std::ostringstream oss;
for (...) {
    for (...) {
        oss << first << " " << second << "\n";
    }
}
std::vector<char> v(oss.str().c_str(), oss.str().c_str() + oss.str().size());
uint32_t len = v.size();
iovec iv[2] = { { &len, sizeof(len) }, { &v[0], len } };
writev(sock, iv, 2);

受信コードは次のようになります。

uint32_t len;
recv(sock, &len, sizeof(len), 0);
std::vector<char> v(len + 1);
recv(sock, &v[0], len, 0);
v[len] = '\0';
std::string s(&v[0]);
std::istringstream iss(s);
for (;;) {
    for (;;) {
        iss >> first >> second;
    }
}
于 2013-09-03T19:18:39.303 に答える