Is there a valid reason to not use TcpListener
for implementing a high performance/high throughput TCP
server instead of SocketAsyncEventArgs
?
I've already implemented this high performance/high throughput TCP server using SocketAsyncEventArgs
went through all sort of headaches to handling those pinned buffers using a big pre-allocated byte
array and pools of SocketAsyncEventArgs
for accepting and receiving, putting together using some low level stuff and shiny smart code with some TPL Data Flow and some Rx and it works perfectly; almost text book in this endeavor - actually I've learnt more than 80% of these stuff from other-one's code.
However there are some problems and concerns:
- Complexity: I can not delegate any sort of modifications to this server to another member of the team. That bounds me to this sort of tasks and I can not pay enough attention to other parts of other projects.
- Memory Usage (pinned
byte
arrays): UsingSocketAsyncEventArgs
the pools are needed to be pre-allocated. So for handling 100000 concurrent connections (worse condition, even on different ports) a big pile of RAM is uselessly hovers there; pre-allocated (even if these conditions are met just at some times, server should be able to handle 1 or 2 such peaks everyday). TcpListener
actually works good: I actually had putTcpListener
into test (with some tricks like usingAcceptTcpClient
on a dedicated thread, and not theasync
version and then sending the accepted connections to aConcurrentQueue
and not creatingTask
s in-place and the like) and with latest version of .NET, it worked very well, almost as good asSocketAsyncEventArgs
, no data-loss and a low memory foot-print which helps with not wasting too much RAM on server and no pre-allocation is needed.
So why I do not see TcpListener
being used anywhere and everybody (including myself) is using SocketAsyncEventArgs
? Am I missing something?