Opened 16 years ago

Closed 16 years ago

Last modified 3 weeks ago

#79 closed feature-request (Fixed)

Bind outgoing connections to local port

Reported by: peterdk Owned by: andar
Priority: minor Milestone:
Component: Core Version: 1.1.0_dev
Keywords: bind to local port tcp SO_REUSEADDR Cc:


I am using QoS at home to manage my bittorrent traffic. Unfortunately not all trafic is caught with the L7 and IPP2P filters. Though it is possible to set incoming ports, it is not possible yet to define the outgoing port(s). QoS filtering is therefore not really possible, only if one would totally define all traffic except www traffic as "low" class.

A solution to this problem is to bind all the outgoing Deluge connections to a specified local port instead of just letting the OS randomly assigning a unique port for every single one.

Azureus has implemented this and this allows for a easy QoS rule that filters all traffic coming from the defined port. It is a ideal solution for home QoS filtering without having any effect on the QoS of ISP's, so possible encryption doesn't need to be turned off.

Someone from the Azureus channel explained how it could be done:

[17:55] <wereHamster> so I'd like to know how it's possible to initiate multiple connections from the same port :)
[17:58] <The_8472> tools -> options -> connections -> advanced network settings -> bind to port
[17:58] <wereHamster> I know, but how is it technically done, bind() fails if the port is already taken (EADDRINUSE
[17:59] <The_8472> use SO_REUSEADDR
[18:01] <wereHamster> This socket option tells the kernel that even if this port is busy (in the TIME_WAIT state), go ahead and reuse it anyway. If it is busy, but with another state, you will still get an address already in use
[18:02] <wereHamster> error.
[18:02] <The_8472> that only applies to the same socket pair
[18:03] <The_8472> if it's a different socket pair then it does what you want
[18:03] <wereHamster> ok, thanks

Since I am planning to move from Azureus to a more native Linux app, I would like to request that the option of forced binding to a local port be added to Deluge. I also submitted this feature request to Transmission and I hope this will help making Deluge too a better client.

Something from the Azureus wiki that maybe is good to know if this feature is added/developed:

  • Bind to local Port This sets outgoing connections to a fixed source port. This can be used with full cone NAT routers to reduce the number of NAT table entries and thus prevent crashes on some router models. When the outgoing port is bound to the same as the incoming port that might even solve NAT problems on full cone NAT routers.

Note: Binding to the same port as the incoming port works under Windows 2k and greater only. Unix users should use a different port. It's not working at all under Mac OS X.

Change History (6)

comment:1 by peterdk, 16 years ago

It looks like this has been implemented in libtorrent:

comment:2 by markybob, 16 years ago


this is only in libtorrent trunk, which 0.5 will never use.

comment:3 by andar, 16 years ago

Milestone: 1.1.0
Version: 0.6.0svn1.1.0_dev

comment:4 by andar, 16 years ago

Resolution: fixed
Status: newclosed

Implemented [3602]

comment:5 by (none), 15 years ago

Milestone: 1.1.0

Milestone 1.1.0 deleted

comment:6 by xak, 15 years ago

It appears that on my Linux machine I can only bind to the /same/ port as the incoming listen port. Attempting to bind to a different port results in " Cannot assign requested address" error. All is well using same port as incoming listen port.

System: Ubuntu Hardy 8.04 kernel 2.6.24-22-server x86_64 sun-java-6-jre version 6-07-3ubuntu2 build 1.6.0_07-b06 Azureus 2009.01.26 version

Note: See TracTickets for help on using tickets.