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