1

AS3 でソケットのプログラミングを試みていますが、少し問題があります。

C++ サーバーと Flash AS3 クライアントを使用しています。これは最初のゲームでの私の貧弱な試みなので、ここでは何も起こりません. 私はプログラミングの経験がほとんどないので、ご容赦ください。

これは、サーバーからクライアント (HEX) に送信するものです。

S = パケット サイズ、C = コンテンツ、H = ヘッダー (基本的に、このパケットが何をするかをクライアントに伝えます)

S  H  C..
06 02 00 00 00 00
06 03 D1 13 01 07
02 04

ただし、フラッシュ クライアントが情報を受信すると、次のように受信されます。

S  H  C..
06 02 00 00 00 00
06 03 D1 13 01 07
06 03 D1 13 01 07 -- weird duplicate?
02 04

メッセージの 1 つが重複している理由がわかりません。C++ サーバーの書き込み関数に trace() を配置しました。間違いなく 1 回送信しているように見えますが、Flash クライアントはそれを 2 回読み取ります。

s.addEventListener(ProgressEvent.SOCKET_DATA, sData);
function sData(e:ProgressEvent):void
{
    while(true){
        try {

            GetByte(); //packet size, im ignoring it for now
            parsePacket();
        }
        catch (error:Error)
        {
            trace(error);
            break;
        }
    }
}
function parsePacket()
{
    var header:uint = GetByte();
    trace("New Packet: ", header);
    switch (header){
        case 0x01:
            //dostuffwithcontent
            break;

        case 0x02:
            //i use it 4 times so there is no "leftover"
            //i actually do stuff with the bytes in real code, but this is only to make it easier to read
            GetByte();GetByte();GetByte();GetByte();
            break;

        case 0x03:
            //this is called twice
            //Flash is reading the same info 2 times from the socket, even though it has only been sent once.
            GetByte();GetByte();GetByte();GetByte();
            break;

        case 0x04:
            trace("last packet received");
            break;

        default:
            break;

    } 
}

function GetByte():uint{return socket_.readUnsignedByte();}

これは、情報を送信するために使用する C++ 関数です。各「パケット」の後に一度呼び出します。

void outputMessage(NetworkMessage& msg)
{
    std::cout << msg.size() << std::endl; //never called more than required, and always shows correct size
    boost::asio::async_write(socket_,boost::asio::buffer(msg.getOutputBuffer(), msg.size()),boost::bind(&Session::handle_write, this,boost::asio::placeholders::error));
}

私は何を間違っていますか?Flash がソケットから 2 回読み取っている理由がわかりません。

助けていただければ幸いです、ありがとう。

更新: わかりました、ようやく Windows で localhost トラフィックを盗聴する方法を見つけました。結局のところ、サーバーはメッセージを 2 回送信していますが、それはクライアントのせいではありません:D 関数 outputMessage は、すべてのパケットが生成された後に 1 回だけ呼び出されます、しかし、何らかの理由で、同じパケットがまだ 2 回設定されています。これはフラッシュではなく、ブースト関連の問題だと思います。

Update2: 修正しました!!! それは非常にばかげたことでした。これが間違っていることさえ知りませんでした。サーバー側では、次のようなものがありました。

NetworkMessage msg;
msg.AddByte(0x03);
outputMessage(msg);

NetworkMessage msg;
msg.AddByte(0x04);
outputMessage(msg);

両方の変数が同じ名前であるため、明らかにエラーが発生したため、名前を変更する代わりに、これを試しました (プログラムには奇妙な副作用があったため、これは明らかに間違っています)。

{
    NetworkMessage msg;
    msg.AddByte(0x03);
    outputMessage(msg);
}
NetworkMessage msg;
msg.AddByte(0x04);
outputMessage(msg);

私はとてもばかげていると感じます。お手間をおかけして本当に申し訳ありません…

4

0 に答える 0