示例#1
0
        //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;
        }
示例#2
0
 /// <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());
 }