/// <summary> /// 发送完成时处理函数 /// </summary> /// <param name="e">与发送完成操作相关联的SocketAsyncEventArg对象</param> private void ProcessSend(SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success) { //Socket s = (Socket)e.UserToken; AsyncUserToken token = (AsyncUserToken)e.UserToken; //TODO if (!token.Socket.ReceiveAsync(e))//为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件 { //同步接收时处理接收完成事件 //ProcessReceive(e); ProcessSend(e); } } else { CloseClientSocket(e); } }
/// <summary> ///接收完成时处理函数 /// </summary> /// <param name="e">与接收完成操作相关联的SocketAsyncEventArg对象</param> private void ProcessReceive(SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success)//if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) { // 检查远程主机是否关闭连接 if (e.BytesTransferred > 0) { //Socket s = (Socket)e.UserToken; AsyncUserToken token = (AsyncUserToken)e.UserToken; if (token.Socket == null) { return; } //判断所有需接收的数据是否已经完成 //if (token.Socket.Poll(-1, SelectMode.SelectRead))//(s.Available == 0) { //从侦听者获取接收到的消息。 //String received = Encoding.ASCII.GetString(e.Buffer, e.Offset, e.BytesTransferred); //echo the data received back to the client //e.SetBuffer(e.Offset, e.BytesTransferred); byte[] data = new byte[e.BytesTransferred]; Array.Copy(e.Buffer, e.Offset, data, 0, data.Length);//从e.Buffer块中复制数据出来,保证它可重用 lock (token.Buffer) { token.Buffer.AddRange(data); } //Console.WriteLine(_serverSock.LocalEndPoint.ToString()); string info = Encoding.Default.GetString(data); Log4Debug(String.Format("收到 {0} 数据为 {1}", token.Remote.ToString(), info)); //TODO 处理数据 //sf.ReceiveData(info, token.Socket); mf.TCPReceiveData = info; if (mf.PJLink_Pro) { mf.Invoke(new MethodInvoker(delegate() { mf.richTextBox2.AppendText("Receive:" + info); })); } //e.SetBuffer(e.Offset, e.BytesTransferred); //Send(s, data,0,data.Length,10); //m_sendSAEA = new SocketAsyncEventArgs(); //Send(m_sendSAEA, data); //增加服务器接收的总字节数。 } if (!token.Socket.ReceiveAsync(e))//为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件 { //同步接收时处理接收完成事件 ProcessReceive(e); //ProcessSend(e); } } else { //Log4Debug(String.Format("断开连接===")); CloseClientSocket(e); } } else { CloseClientSocket(e); } }