使用.Net 4.5异步功能进行套接字编程

我以前使用过BeginAccept()和BeginRead(),但与Visual Studio 2012我想利用新的异步的(async,await)功能在我的socket服务器程序。


我该如何完成AcceptAsync和ReceiveAsync功能?


using System.Net;

using System.Net.Sockets;


namespace OfficialServer.Core.Server

{

    public abstract class CoreServer

    {

        private const int ListenLength = 500;

        private const int ReceiveTimeOut = 30000;

        private const int SendTimeOut = 30000;

        private readonly Socket _socket;


        protected CoreServer(int port, string ip = "0.0.0.0")

        {

            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            _socket.Bind(new IPEndPoint(IPAddress.Parse(ip), port));

            _socket.Listen(ListenLength);

            _socket.ReceiveTimeout = ReceiveTimeOut;

            _socket.SendTimeout = SendTimeOut;

            _socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);

            _socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);

        }


        public void Start()

        {    

        }

    }

}


慕码人8056858
浏览 549回答 3
3回答

aluckdog

您可以使用TaskFactory.FromAsync自动换行Begin/ End成对async操作。Stephen Toub 在他的博客上有一个等待Socket更有效的*Async终端的等待。我建议将其与TPL Dataflow结合使用,以创建完全async兼容的Socket组件。

胡子哥哥

Socket.ReceiveAsync很奇怪。它与.net4.5中的async / await功能无关。它被设计为一种替代套接字API,它不会像BeginReceive / EndReceive那样破坏内存,只需要在最核心的服务器应用程序中使用。为了给您一些规模感,我们运行了一个服务器BeginXXXX / EndXXXX方法,可以轻松支持5000个连接的客户端。我从来没有需要使用ReceiveAsync,我可能在考虑使用ReceiveAsync和SocketAsyncEventArgs进行重写之前升级硬件,因为它可能在我的时间方面更便宜。
打开App,查看更多内容
随时随地看视频慕课网APP