1

サイズ(3番目のパラメーター)のBeginReceiveメソッドのエラーが発生するのはなぜですか?

ただし、BUFFER_SIZEは、定数値(2048バイト)よりも大きくなることはありません(長さ)。

これは私のコードです:

public void Send(byte[] byteData, M.StateObject _stateObj, Socket client)
    {
        // Begin sending the data to the remote client(s):
        client.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendData), _stateObj);
    }

    void SendData(IAsyncResult ar)
    {
        try
        {
            M.StateObject stateObj = (M.StateObject)ar.AsyncState;
            Socket client = stateObj.server;
            byte[] data = stateObj.data;
            int bytesSent = client.EndSend(ar);
            client.BeginReceive(data, 0, M.StateObject.BUFFER_SIZE, SocketFlags.None, new AsyncCallback(ReceiveData), stateObj);
            allDone.Set();
        }
        catch (Exception ex)
        {
            OnMessageShowing(ex.Message);
        }
    }

    private void ClientLogging(object _data, M.StateObject _stateObj)
    {
        M.UserData client = _data as M.UserData;
        if (client != null)
        {
            //setting properties:
            client.bConnectred = true;

            // 1. add client to list of clients:
            ClientAddingRemoving(_stateObj, client, true);

            // 2. showing welcome on server
            OnMessageShowing(client.ServerNotifying());

            // 3. refreshing the list of clients on server`s main form
            OnClientsListRefreshing(bll.ClientsListCreating(listOfClients));

            // 4. send welcome note to all clients:
            byte[] bytesToSend = M.SerializeServer.Login_WelcomeToAllClients(client);
            bytesToSend = M.BytesArrayGetSet.BytesSending_Set(bytesToSend);
            SendToAll(bytesToSend, _stateObj.server);

            // 5. send list of all users to logged client:
            bytesToSend = M.SerializeServer.Login_ToLoggedClient(bll.ListOfAllUsers(listOfClients));
            bytesToSend = M.BytesArrayGetSet.BytesSending_Set(bytesToSend);
            Send(bytesToSend, _stateObj, _stateObj.server);

            //6. send new client to list of all other clients:
            bytesToSend = M.SerializeServer.Login_ToAllClients(client);
            bytesToSend = M.BytesArrayGetSet.BytesSending_Set(bytesToSend);
            SendToAll(bytesToSend, _stateObj.server);
        }
    }

    private void SendToAll(byte[] data, Socket _socket)
    {
        foreach (M.StateObject stObj in listOfClients.Keys) //dictionary<StateObject, Client>, Client is a custom client class
        {
            Send(data, stObj, _socket);
        }
    }

StateObjectクラスは次のとおりです。

public class StateObject 
{    
    public Socket Server;
    public const int BUFFER_SIZE = 2048;
    public byte[] data = new byte[BUFFER_SIZE];
}

Send()メソッドを何度も呼び出しているのではないでしょうか。「ManualResetEvent」デリゲートを使用してブロックしたり、他のことをしたりする必要がありますか?私は本当に何をすべきかわからない。

4

1 に答える 1

2

に置き換えM.StateObject.BUFFER_SIZEてくださいstateObj.data.Length、どういうわけか。dataよりも小さいですBUFFER_SIZE

また、データを配列に出力しているようですが、何もしていません。これを変更することをお勧めします

byte[] data = stateObj.data;
int bytesSent = client.EndSend(ar);
client.BeginReceive(data, 0, M.StateObject.BUFFER_SIZE, SocketFlags.None, new AsyncCallback(ReceiveData), stateObj);

これに

int bytesSent = client.EndSend(ar);
client.BeginReceive(stateObj.data, 0, stateObj.data.Length, SocketFlags.None, new AsyncCallback(ReceiveData), stateObj);

それでエラーが修正されるかどうかを確認してください。


また、BeginSendが状態オブジェクトblobを渡していることに気づきました。データの送信に使用したアレイもありstateObj.dataますか?もしそうなら、BeginSendへの複数の呼び出しは新しいstateObjオブジェクトを使用していますか?それらがすべて同じ状態オブジェクトを共有している場合は、現在の受信が書き込みを行っているのと同時に次の送信を読み取りにすることができます。

于 2012-10-27T21:47:48.410 に答える