2

私のゲームとサーバーの仕組みは次のとおりです。

私が作成した形式でエンコードされたメッセージを送信します。'p' で始まり、その後にメッセージ長の整数、次にメッセージが続きます。

例: p3m15 メッセージの長さは 3 バイトです。これはメッセージ 15 に対応します。その後、メッセージが解析されます。

これは、TCP が 1 バイトのみを送信する可能性があるように設計されています (TCP は最小 8 ビットのみを送信する必要があるため)。

私が作成したこのメッセージ プロトコルは非常に軽量で、うまく機能するため、JSON や他のプロトコルよりも使用しています。

私の主な関心事は、クライアントとサーバーがどのように話し始めるべきかということです。

サーバーは、クライアントが私の形式でメッセージを送信することを期待しています。ゲームは常にこれを行います。

私が遭遇した問題は、ポート 1720 でサーバーをテストしたときに発生しました。BitTorrent トラフィックがあり、サーバーがそれを拾っていました。これにより、あらゆる種類のランダムな「クライアント」がサーバーに接続され、ランダムなガベージが送信されていました。

これを「解決」するために、クライアントが最初に送信する必要があるのは文字列「Hello Server」になるようにしました。

送信された最初のバイトが != 'H' である場合、または 12 バイトを超える送信があり、それが != "Hello Server" である場合は、すぐに切断します。

これはうまく機能しています。少し素朴なことをしているのか、それとももっと標準的な対処方法があるのか​​ 疑問に思っています:

- サーバーとの通信を開始するクライアント - クライアントは Hello サーバー チェックに合格しますが、途中で無効なメッセージが表示されます。アプリが無効なメッセージを送信することはないと想定できます。もしそうなら、それはバグでしょう。現在、無効なメッセージを検出した場合は、クライアントを切断します。

BitTorrent が各メッセージの前に「!!BitTorrent Protocol」を送信していることに気付きました。私はそのようなことをすべきですか?

これに関するアドバイスと、より安全で安全なものにすることは非常に役立ちます。ありがとう

4

2 に答える 2

2

おそらくあなたのメッセージに埋め込まれたマジックナンバーフィールド。

struct Message
{
    ...
    unsigned magic_number = 0xbadbeef3;
    ...
};

したがって、何かを受け取った後に最初に行うことは、magic_numberフィールドが0xbadbeef3であるかどうかを確認することです。

于 2013-01-07T00:19:54.193 に答える
0

通常、私は次のようなヘッダーを使用してプロトコルを設計します。

typedef struct {
    uint32_t    signature;
    uint32_t    length;
    uint32_t    message_num;
} header_t;

typedef struct {
    uint32_t    foo;
} message13_t;

メッセージの送信:

message13_t msg;
msg.foo = 0xDEADBEEF;

header_t hdr;
hdr.signature = 0x4F4C494D;         // "MILO"
hdr.length = sizeof(message13_t);
hdr.message_num = 13;

// Send the header
send(s, &hdr, sizeof(hdr), 0);

// Send the message data
send(s, &msg, sizeof(msg), 0);

メッセージの受信:

header_t hdr;
char* buf;

// Read the header - all messages always have this
recv(s, &hdr, sizeof(hdr), 0);

// allocate a buffer for the rest of the message
buf = malloc(hdr.length);

// Read the rest of the message
recv(s, buf, hdr.length, 0);

このコードには、エラーチェックやすべてのデータの送受信が行われていることの確認が含まれていないことは明らかです。

于 2013-01-07T00:23:31.547 に答える