【发布时间】:2016-04-07 21:26:46
【问题描述】:
所以我一直在研究套接字编程并阅读创建高性能服务器的方法。
阅读关于使用Socket 的AcceptAsync 方法,以及如果连接立即可用,有时调用可能如何同步执行(并返回false),以及如何在接受连接后将套接字重新置于侦听状态,我开始怀疑这是否真的意味着,尽管使用AcceptAsync 接受连接的套接字会异步“等待”,但最终它一次只会处理 1 个新连接,即使一次连接 1000 个客户端,也取决于多快客户端可能会被传递到另一个线程进行处理,这可能会限制性能。
这让我想知道我是否可以考虑到这一点来编写我的类,对所有连接使用 SocketAsyncEventArgs 的单个实例,而不是我最初打算使用的对象池。
考虑到这一点,我想知道如果在没有可用连接的情况下多次调用AcceptAsync 会发生什么。所以我做了这个非常粗略的测试应用程序,看看会发生什么:
class Program
{
private static Socket s;
static void Main(string[] args)
{
s = new Socket(IPAddress.Any.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
s.Bind(new IPEndPoint(IPAddress.Any, 10001));
s.Listen(10);
var e = new SocketAsyncEventArgs();
e.Completed += EOnCompleted;
s.AcceptAsync(e);
e = new SocketAsyncEventArgs();
e.Completed += EOnCompleted;
s.AcceptAsync(e);
e = new SocketAsyncEventArgs();
e.Completed += EOnCompleted;
s.AcceptAsync(e);
e = new SocketAsyncEventArgs();
e.Completed += EOnCompleted;
s.AcceptAsync(e);
while (true)
{
}
}
private static void EOnCompleted(object sender, SocketAsyncEventArgs socketAsyncEventArgs)
{
Console.WriteLine(socketAsyncEventArgs.AcceptSocket.RemoteEndPoint);
Thread.Sleep(10000);
var e = new SocketAsyncEventArgs();
e.Completed += EOnCompleted;
s.AcceptAsync(e);
}
}
我使用一个 tcp 测试应用程序向应用程序发送连接垃圾邮件,结果显示多个 AcceptAsync 调用创建了多个似乎并行执行的接受/完成循环。
我的问题是,这真的有什么好处吗?这是允许更快处理传入连接的合法方式吗?有什么缺点吗?
编辑 1:进一步研究,如果数据始终可用于处理异步调用,那么它们将全部同步运行并且永远不会返回接受新连接,或者至少,在技术上似乎有可能严重延迟。
如果确实如此,您如何生产高性能服务器?
【问题讨论】:
标签: c# sockets network-programming