Ejemplo n.º 1
0
        ///-------------------------------------------------------------------------------------------------
        /// <summary> 由于打包器做了数据管理,所以直接丢打包器进来发送数据. </summary>
        /// <exception cref="SocketException"> Thrown when a
        ///                                    Socket error
        ///                                    condition
        ///                                    occurs. </exception>
        ///
        /// <param name="ipt2"> 打包器. </param>
        ///
        /// <returns> 如果确实开始发送了则返回true,否则返回false. </returns>
        ///-------------------------------------------------------------------------------------------------
        internal bool SendData(IPacket2 ipt2)
        {
            if (IsConnected)
            {
#if !NEW_EVENT_AEGS
                //拷贝数据到sendBuffer上
                int sendLen = ipt2.WriteSendDataToBuffer(_sendBuffer, 0, _sendBuffer.Length);
                if (sendLen == 0)//为0表示没有要发送的数据
                {
                    return(false);
                }
                _sendArgs.SetBuffer(_sendBuffer, 0, sendLen);
#else
                SocketAsyncEventArgs sendArgs = new SocketAsyncEventArgs();
                sendArgs.UserToken      = this.clientSocket;
                sendArgs.RemoteEndPoint = this.hostEndPoint;
                sendArgs.SetBuffer(data, 0, data.Length);
                sendArgs.Completed += new EventHandler <SocketAsyncEventArgs>(OnSend);
#endif
                PrepareSend(_clientSocket, _sendArgs);

                _sendTime.WorkStart();
                return(true);
            }
            else
            {
                throw new SocketException((int)SocketError.NotConnected);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 构造函数: 创建出一个Socket对象
        /// </summary>
        internal SocketClient(string hostName, int port, IPacket2 packet2)
        {
            try
            {
                IPHostEntry host;
                if (Regex.IsMatch(hostName, @"\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}"))
                {
                    byte[] ipadr = new byte[4];

                    MatchCollection ms = Regex.Matches(hostName, @"\d{1,3}");
                    for (int i = 0; i < ms.Count; i++)
                    {
                        ipadr[i] = Convert.ToByte(hostName.Substring(ms[i].Index, ms[i].Length));
                    }

                    IPAddress address = new IPAddress(ipadr);
                    this._hostEndPoint = new IPEndPoint(address, port);
                }
                else
                {
                    host = Dns.GetHostEntry(hostName);
                    IPAddress[] addressList = host.AddressList;

                    //实例化 endpoint 和 socket.
                    this._hostEndPoint = new IPEndPoint(addressList[addressList.Length - 1], port);
                }

                this._clientSocket = new Socket(this._hostEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

                //设置这个Timeout应该是无效的(是有效的,必须设置为0,否则自动断线)
                _clientSocket.SendTimeout    = 8 * 1000;
                _clientSocket.ReceiveTimeout = 0;
            }
            catch (Exception e)
            {
                DxDebug.LogWarning("SocketClient.SocketClient():类构造函数错误: " + e.Message);
                return;
            }

            if (_areConnectDone == null)
            {
                _areConnectDone = new AutoResetEvent(false);
            }
            if (_receiveBuffer == null)
            {
                _receiveBuffer = new byte[RECE_BUFFER_SIZE];
            }
            if (_sendBuffer == null)
            {
                _sendBuffer = new byte[SEND_BUFFER_SIZE];
            }

            _packet2 = packet2;

#if !NEW_EVENT_AEGS
            _sendArgs           = new SocketAsyncEventArgs();
            _sendArgs.UserToken = this._clientSocket; //利用了Token
            //_sendArgs.RemoteEndPoint = null;
            _sendArgs.Completed += new EventHandler <SocketAsyncEventArgs>(ProcessSend);

            _receiveArgs           = new SocketAsyncEventArgs();
            _receiveArgs.UserToken = this._clientSocket;//利用了Token
            _receiveArgs.SetBuffer(_receiveBuffer, 0, _receiveBuffer.Length);
            _receiveArgs.Completed += new EventHandler <SocketAsyncEventArgs>(ProcessReceive);
#endif
            DxDebug.Log("SocketClient.SocketClient().SocketClient类构造对象成功!");
        }