0

だから、私はサーバー/クライアントアプリケーションを持っています.コードの特定の時点で、クライアントはサーバーにログインする必要があるため、サーバーはクライアントからユーザー名とパスワードを要求します(そして、それをチェックして何とか何とか)

こちらが私のコード、クライアント側 (AS3)

function hwndLogKeyboard(evt:KeyboardEvent):void
{
    if (evt.keyCode == 13)
    {
        var allow:Boolean = false;
        var prompt:String;

        socket.writeMultiByte("002", "us-ascii");
        socket.writeByte(0);
        socket.flush();

        while (socket.bytesAvailable == 0)
        {
            trace("waiting for bytes to read");
        }

        prompt = socket.readMultiByte(2, "us-ascii"); //YOU WERE MISSING ); here originally updated as I was formatting, probably just copy paste error
        trace(prompt);
        if (prompt == "UN")//server has prompted for username information, time to send it
          {  
            socket.writeMultiByte(inputname.text, "us-ascii");
            socket.flush();

            prompt = socket.readMultiByte(2, "us-ascii");

            if (prompt == "PW")//server has prompted for password information, time to send it
              {
                 socket.writeMultiByte(inputpass.text, "us-ascii");
                 socket.writeByte(0);
                 socket.flush();
             }
         }

        //more code in here that i have commented out until this issue is resolved

    }

およびサーバー側(問題が発生していると確信している場合、C++で記述)

if(testr >= 0)
{
    string dataR = string(buffer);
    //data was recived from a client - analize the data to find out what it means
    //signals are in the format "xxx" where 'x' is an int between 0-9

    if(dataR == "001")
    {
        cout << "A new client has connected" << endl;
    }
    else if(dataR == "002")//002 is a client attempting to log-on to the server
    {
        cout << "Client requesting log-on" << endl;
        char recvUsername[16];
        const char requestUsername[3] = "UN";
        char recvPassword[16];
        const char requestPassword[3] = "PW";

        send(Client,requestUsername,3,0);//request username from client

        recv(Client,recvUsername,16,0);//got username, now time to request password

        send(Client,requestPassword,16,0);//request password from client

        recv(Client,recvPassword,3,0);//got password, now time to compare them against current records

        cout << recvUsername << endl << recPassword << endl;
    }
    else if(dataR == "003")
    {
        cout << "A client has used chat" << endl;
    }
}
else
{
    cout << "error" << endl << testr << endl << WSAGetLastError << endl;
}

最初は、サーバーがバッファに書き込む前にクライアントがバッファから読み取っていた可能性があると考えていました。これは、読み取りバッファが空であるために AS3 がクラッシュしたためです。

しかし、ここにトリックがあります。ブロックsend(Client,requestUsername,3,0)内に移動でき、正常に動作します。if(dataR == "001")データは、フラッシュが検索するときに読み取ることができます。実際、クライアントのソケットが作成された後、その send ステートメントをサーバーのほぼどこにでも置くことができ、それは機能しますが、必要な場所ではありません。

それが私が追加した理由です

while (socket.bytesAvailable == 0)
{                                   
    trace("waiting for bytes to read");
}

whileクライアントでは、読み取るデータが存在するまでループが発生するようにします。それが問題だった場合は、その厄介なループが存在するのを避けるために、いくつかのことを書き直していたでしょう。私が理解していないのは、それが無限ループに入り、トレースステートメントであふれていることです。サーバーはデータをソケットに書き込みませんが、コードの他の場所から書き込みます。エラーもコンパイラの苦情もありません。スコープ外に出たり、そのようなことはありません。ここで何かがおかしいだけです。

助けていただければ幸いです - タイラー

まだこの問題がありますが、「else if」ブロック内を除いて、コード内の他のすべての場所で機能します。完全に困惑しています。

4

0 に答える 0