双工服务器环境中的SocketAsyncEventArgs?

时间:2017-01-14 00:47:41

标签: c# .net sockets 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");
            }

        }

谢谢!

1 个答案:

答案 0 :(得分:0)

解决方案是为SocketAsyncEventArgsSend创建单独的Receive

需要更多内存但不多,因为不需要为Send args分配缓冲区。