/// <summary> /// 当Socket上的发送或接收请求被完成时,调用此函数 /// </summary> /// <param name="sender">激发事件的对象</param> /// <param name="e">与发送或接收完成操作相关联的SocketAsyncEventArg对象</param> private void OnIOCompleted(object sender, SocketAsyncEventArgs e) { // Determine which type of operation just completed and call the associated handler. AsyncUserToken userToken = e.UserToken as AsyncUserToken; lock (userToken) { switch (e.LastOperation) { case SocketAsyncOperation.Accept: ProcessAccept(e); break; case SocketAsyncOperation.Receive: ProcessReceive(e); break; //case SocketAsyncOperation.Send: // ProcessSend(e); // break; } } }
/// <summary> ///接收完成时处理函数 /// </summary> /// <param name="e">与接收完成操作相关联的SocketAsyncEventArg对象</param> private void ProcessReceive(SocketAsyncEventArgs e) { AsyncUserToken userToken = e.UserToken as AsyncUserToken; if (userToken.ReceiveEventArgs.BytesTransferred > 0 && userToken.ReceiveEventArgs.SocketError == SocketError.Success) { Socket sock = userToken.ConnectSocket; //判断所有需接收的数据是否已经完成 if (sock.Available == 0) { //把收到的数据写入到缓存区里面 userToken.ReceiveBuffer.WriteBuffer(e.Buffer, e.Offset, e.BytesTransferred); //TODO 处理数据 string info = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred); //Log4Debug(String.Format("收到 {0} 数据为 {1}", sock.RemoteEndPoint.ToString(), info)); Send(userToken.SendEventArgs, e.Buffer, e.BytesTransferred); } //TODO:Cannot access a disposed object.Object name: 'System.Net.Sockets.Socket'. try { if (!sock.ReceiveAsync(userToken.ReceiveEventArgs))//为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件 { //同步接收时处理接收完成事件 ProcessReceive(userToken.ReceiveEventArgs); } } catch (ObjectDisposedException oex) { Console.WriteLine("Client was closed:" + oex.Message); CloseClientSocket(userToken); } } else { CloseClientSocket(userToken); } }