Simple TCP proxy

Martin Di Paola martinp.dipaola at gmail.com
Wed Jul 27 16:58:10 EDT 2022


On Wed, Jul 27, 2022 at 08:32:31PM +0200, Morten W. Petersen wrote:
>You're thinking of the backlog argument of listen?

 From my understanding, yes, when you set up the "accepter" socket (the
one that you use to listen and accept new connections), you can define
the length of the queue for incoming connections that are not accepted
yet.

This will be the equivalent of your SimpleQueue which basically puts a
limits on how many incoming connections are "accepted" to do a real job.

Using skt.listen(N) the incoming connections are put on hold by the OS
while in your implementation are formally accepted but they are not
allowed to do any meaningful work: they are put on the SimpleQueue and
only when they are popped then they will work (send/recv data).

The difference then between the OS and your impl is minimal. The only
case that I can think is that on the clients' side it may exist a
timeout for the acceptance of the connection so your proxy server will
eagerly accept these connections so no timeout is possible(*)

On a side note, you implementation is too thread-naive: it uses plain
Python lists, integers and boolean variables which are not thread safe.
It is a matter of time until your server will start behave weird.

One option is that you use thread-safe objects. I'll encourage to read
about thread-safety in general and then which sync mechanisms Python
offers.

Another option is to remove the SimpleQueue and the background function
that allows a connection to be "active".

If you think, the handlers are 99% independent except that you want to
allow only N of them to progress (stablish and forward the connection)
and when a handler finishes, another handler "waiting" is activated, "in
a queue fashion" as you said.

If you allow me to not have a strict queue discipline here, you can achieve
the same results coordinating the handlers using semaphores. Once again,
take this email as starting point for your own research.

On a second side note, the use of handlers and threads is inefficient
because while you have N active handlers sending/receiving data, because
you are eagerly accepting new connections you will have much more
handlers created and (if I'm not wrong), each will be a thread.

A more efficient solution could be

1) accept as many connections as you can, saving the socket (not the
handler) in the thread-safe queue.
2) have N threads in the background popping from the queue a socket and
then doing the send/recv stuff. When the thread is done, the thread
closes the socket and pops another from the queue.

So the queue length will be the count of accepted connections but in any
moment your proxy will not activate (forward) more than N connections.

This idea is thread-safe, simpler, efficient and has the queue
discipline (I leave aside the usefulness).

I encourage you to take time to read about the different things
mentioned as concurrency and thread-related stuff is not easy to
master.

Thanks,
Martin.

(*) make your proxy server slow enough and yes, you will get timeouts
anyways.

>
>Well, STP will accept all connections, but can limit how many of the
>accepted connections that are active at any given time.
>
>So when I bombed it with hundreds of almost simultaneous connections, all
>of them were accepted, but only 25 were actively sending and receiving data
>at any given time. First come, first served.
>
>Regards,
>
>Morten
>
>On Wed, Jul 27, 2022 at 8:00 PM Chris Angelico <rosuav at gmail.com> wrote:
>
>> On Thu, 28 Jul 2022 at 02:15, Morten W. Petersen <morphex at gmail.com>
>> wrote:
>> >
>> > Hi.
>> >
>> > I'd like to share with you a recent project, which is a simple TCP proxy
>> > that can stand in front of a TCP server of some sort, queueing requests
>> and
>> > then allowing n number of connections to pass through at a time:
>>
>> How's this different from what the networking subsystem already does?
>> When you listen, you can set a queue length. Can you elaborate?
>>
>> ChrisA
>> --
>> https://mail.python.org/mailman/listinfo/python-list
>>
>
>
>-- 
>I am https://leavingnorway.info
>Videos at https://www.youtube.com/user/TheBlogologue
>Twittering at http://twitter.com/blogologue
>Blogging at http://blogologue.com
>Playing music at https://soundcloud.com/morten-w-petersen
>Also playing music and podcasting here:
>http://www.mixcloud.com/morten-w-petersen/
>On Google+ here https://plus.google.com/107781930037068750156
>On Instagram at https://instagram.com/morphexx/
>--
>
>I am https://leavingnorway.info
>
>Videos at https://www.youtube.com/user/TheBlogologue
>Twittering at http://twitter.com/blogologue
>
>Blogging at http://blogologue.com
>Playing music at https://soundcloud.com/morten-w-petersen
>
>Also playing music and podcasting here:
>http://www.mixcloud.com/morten-w-petersen/
>
>On Instagram at https://instagram.com/morphexx/
>-- 
>https://mail.python.org/mailman/listinfo/python-list


More information about the Python-list mailing list