無論什么平台,編寫支持高並發性的網絡服務器,瓶頸往往出在I/O上,目前最高效的是采用Asynchronous I/O模型,Linux平台提供了epoll,Windows平台提供了I/O Completion Port(IO完成端口,即IOCP)。
Windows自winsock2開始就提供了IOCP支持,可以通過C++直接調用API,但對於基於.Net的C#開發,是在.Net Framework2.0開始才引入的,在2.0版本下,最高效的網絡服務器是通過異步Socket的一些列Beginxxx,Endxxx方法實現的, 底層就是基於IOCP的。
當.Net Framework升級到2.0 sp1之后,.Net Socket又提供了一種更高效的一些列xxxAsync方法,對底層IOCP實現性能有不少改進,.Net Framework升級到3.5之后更是成熟穩定,微軟也開始大力推廣。
在實際應用中,證明C#編寫基於.Net IOCP的高性能服務器可以支持10000個以上的TCP長連接。但在具體實現過程中需要注意幾個問題:
1.SocketAsyncEventArgs和Buffer最好預先分配,並能回收重復利用。
2.一個Socket的Send和Receive最好分別對應一個SocketAsyncEventArgs,因為當一個 SocketAsyncEventArgs被ReceiveAsync調用掛起后,在調用SendAsync時就會出異常。同樣不要對一個 SocketAsyncEventArgs在一個異步操作被掛起時再次調用。
參考文章:
http://msdn.microsoft.com/zh-cn/magazine/cc163356.aspx
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx