///------------------------------------------------------------------------------------------------- /// <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); } }
/// <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类构造对象成功!"); }