1

私はC#、OOP、ネットワーキング、TCP/IPソケットの初心者です...

非同期TCP/IPソケット通信の使い方について誤解があります。複数のクライアントを待機するサーバーを作成しようとしていますが、クライアントが接続するたびに、「user192.168.1.105:2421joined」のように表示されます。

BeginAccept()を使用すると、新しいスレッドが作成されると思いました...新しいユーザーが接続するたびに、その特定のクライアントとの通信が処理されます。ただし、次のコードはブロックします...そして2番目のクライアントのメッセージを表示しません。

接続されているクライアントごとに、実行を処理する個別のスレッドを持つようにするには、何を変更する必要がありますか?

class Server
{
    Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //constructor 
    public Server()
    {
        listener.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9050));
        listener.Listen(10);
        listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
        Console.Write("Server Running...\r\n");
    }

    public void OnConnectRequest(IAsyncResult ar)
    {
        Socket listener = (Socket)ar.AsyncState;
        NewConnection(listener.EndAccept(ar));
        listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
    }

    //send a string message over a TCP socket 
    public void sendMSG(string msg,Socket socket)
    {
     //some code which sends data according to my protocol
    }

    public byte[] receiveMSG(ref Socket socket)
    {
     //some code which receives data according to my protocol
    }


    //function called whenever a NEW CLIENT is connected
    public void NewConnection(Socket sockClient)
    {
        Console.WriteLine("user {0} has joined",sockClient.RemoteEndPoint);
        byte[] msg = new byte[20];
        sockClient.Receive(msg);
    }
4

1 に答える 1

2

BeginAccept()単一のリクエストを受け入れるため、非同期コールバックは最初のリクエストに対して1回だけ呼び出されます。これは、標準のC#非同期パターンです。

BeginAccept()複数のリクエストを受け入れる場合は、リクエストの処理が完了したら、もう一度電話をかける必要があります。

非同期サーバーソケットの複数のクライアントも参照してください。

編集:

同時リクエストを許可する場合は、とBeginAccept()の間で呼び出す必要があります。EndAccept()NewConnection()

public void OnConnectRequest(IAsyncResult ar)
{
    Socket listener = (Socket)ar.AsyncState;
    Socket accepted = listener.EndAccept(ar);
    listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
    NewConnection(accepted);
}
于 2012-12-25T15:15:48.080 に答える