私は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);
}