//BeginAcceptのコールバック private void AcceptCallback(System.IAsyncResult ar) { //サーバーSocketの取得 System.Net.Sockets.Socket server = (System.Net.Sockets.Socket)ar.AsyncState; //接続要求を受け入れる System.Net.Sockets.Socket client = null; bool flgConnected = false; try { //クライアントSocketの取得 client = server.EndAccept(ar); flgIsAccepting = false; flgConnected = true; } catch { System.Console.WriteLine("接続失敗"); } if (flgRefuseNextConnect) { client.Shutdown(System.Net.Sockets.SocketShutdown.Both); client.Close(); flgConnected = false; } if (flgConnected) { //クライアントが接続した if (FuncWhenAccptd != null) FuncWhenAccptd(nextRemoteID, ((System.Net.IPEndPoint)client.RemoteEndPoint).Address.ToString()); //接続先の同期/非同期受信を設定する Channel arecv = new Channel(nextRemoteID, FuncWhenRecv, client, ChClosed, bufferSize); this.nextRemoteID++; chList.Add(arecv); } //接続要求待機を再開する server.BeginAccept( new System.AsyncCallback(AcceptCallback), server); flgIsAccepting = true; }
/// <summary> /// コンストラクタ,サーバーへ接続します. /// </summary> /// <param name="host"> /// 接続を待っているサーバーのIPアドレスおよびホスト名を指定します. /// IPアドレスにはIPv4およびIPv6を用いることができます. /// </param> /// <param name="port"> /// 接続を待っているサーバーのポート番号(0 から 65535)を指定します. /// </param> /// <param name="connectFunc"> /// サーバーへの接続が成功し,送受信の準備が整った場合に呼び出すコールバック関数のデリゲートを指定します. /// これ以降,Sendを呼び出すことができます. /// コールバックが不要な場合はnullを指定します. /// </param> /// <param name="recvFunc"> /// 接続したサーバーからの受信があった場合に呼び出すコールバック関数のデリゲートを指定します. /// コールバックが不要な場合はnullを指定します. /// </param> /// <param name="discFunc"> /// サーバーとの通信が切断された場合に呼び出すコールバック関数のデリゲートを指定します. /// コールバックが不要な場合はnullを指定します. /// </param> /// <param name="dataLength"> /// 送受信する際に用いるデータ長(byte型配列の要素数)を指定します. /// Sendで送信できる最大データ長になりますが,Sendに与えた配列の大きさによらず, /// このデータ長のデータをクライアントに送ります.このためdataLengthが大きすぎると1回1回の通信に時間がかかります. /// TCP_async.Serverに指定する値と同じにする必要があります. /// </param> public Client(string host, int port, ConnectFunc connectFunc, AsyncRecvBytesFunc recvFunc, DisconnectFunc discFunc, int dataLength) { System.Net.Sockets.Socket soc = ConnectSocket(host, port); ch = new Channel(0, recvFunc, soc, discFunc, dataLength); if (connectFunc != null) connectFunc(0, ((System.Net.IPEndPoint)soc.RemoteEndPoint).Address.ToString()); }