为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕码人8056858 2019-09-20 16:15:26
我以前使用过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()        {            }    }}
查看完整描述

3 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

您可以使用TaskFactory.FromAsync自动换行Begin/ End成对async操作。


Stephen Toub 在他的博客上有一个等待Socket更有效的*Async终端的等待。我建议将其与TPL Dataflow结合使用,以创建完全async兼容的Socket组件。


查看完整回答
反对 回复 2019-09-20
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 548 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信