双工服务器环境中的 SocketAsyncEventArgs



我正在学习使用MSDN教程使用SocketAsyncEventArgs的东西。我只是想知道几件事,即我如何实现具有全双工功能的服务器。

目前,MSDN 示例教您创建一个服务器,该服务器首先侦听,然后在收到某些内容时将其发回。只有这样,服务器才会再次开始侦听。

我想出自己的解决方案的问题是SocketAsyncEventArgs对象只有一个事件,Completed为发送和接收触发的事件。它没有其他事件。

我在一些可怕的翻译网站上读到我

必须使用两个 SocketAsyncEventArgs,一个接收头发。

-未知

我发现关于这个所谓的"增强"套接字实现的信息量令人不安......

这是我的一些代码,以便您可以看到我在做什么。

        //Called when a SocketAsyncEventArgs raises the completed event
        private void ProcessReceive(SocketAsyncEventArgs e)
        {
            Token Token = (Token)e.UserToken;
            if(e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
            {
                Interlocked.Add(ref TotalBytesRead, e.BytesTransferred);
                Console.WriteLine(String.Format("Received from {0}", ((Token)e.UserToken).Socket.RemoteEndPoint.ToString()));
                bool willRaiseEvent = ((Token)e.UserToken).Socket.ReceiveAsync(e);
                if (!willRaiseEvent)
                {
                    ProcessReceive(e);
                }
            }
            else
            {
                CloseClientSocket(e);
            }
        }
        private void ProcessSend(SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.Success)
            {
                // done echoing data back to the client
                Token token = (Token)e.UserToken;
                // read the next block of data send from the client
                bool willRaiseEvent = token.Socket.ReceiveAsync(e);
                if (!willRaiseEvent)
                {
                    ProcessReceive(e);
                }
            }
            else
            {
                CloseClientSocket(e);
            }
        }
        void IOCompleted(object sender, SocketAsyncEventArgs e)
        {
            // determine which type of operation just completed and call the associated handler
            switch (e.LastOperation)
            {
                case SocketAsyncOperation.Receive:
                    ProcessReceive(e);
                    break;
                case SocketAsyncOperation.Send:
                    ProcessSend(e);
                    break;
                default:
                    throw new ArgumentException("The last operation completed on the socket was not a receive or send");
            }
        }

谢谢!

解决方案是为SendReceive创建一个单独的SocketAsyncEventArgs

它需要更多的内存,但不会太多,因为不需要为Send参数分配缓冲区。

相关内容

  • 没有找到相关文章

最新更新