POA is bound to the same port two times - using both IPv6 and IPv4 listeners.
- Product Name: VisiBroker C++
- Product Version: 6.5 and later
- Product Component: Connection Management
- Platform: All
POA is bound to the same port two times using both IPv6 and IPv4 address families.
VisiBroker C++ Server objects found to be using IPV6 Address family by default when portRange property is set. Server POA is binding to both IPV4 and IPv6 listener sockets.
Consider that port x is free and y>=1.
Start server with IIOP listener set to port_x and port range y:
Server will first bind to IPV6: port_x
AND AGAIN THE SAME IPV4: port_x
Ideally, server shall bind to IPV4 port.
The above described behavior is spotted even if IPv6 is not enabled at the system.
In applications using SSL, a Client may get NO_PERMISSION exception. Run the secure server with following properties:
The SecureServer opens a listener with IPv6 but IPv6 is not enabled at the system. The SecureClient always gets a NO_PERMISSION exception as Client used the IPv4 address family:
Completion Status: NO
Start two "basic\bank_agent" Servers with the following properties:
Use "lsof" tool to verifies the problem, the output looks like the following:
Server 5144 lsilva 10u IPv4 0x300003b1cb8 0t0 TCP *:63420 (LISTEN)
Server 5322 lsilva 10u IPv6 0x300024f5e50 0t0 TCP *:63420 (LISTEN)
Both Servers are started on port 63420 except they are on different address families.
This bug has already been addressed in VB6.5 P12 and VB7.0P1 through CR7977 (Disabling creating IPv6 listeners via a property setting). CR7977 introduced a property "vbroker.connection.onlyListenIPv4=true". Using this new property one can prevent the automatic usage of IPv6 and the double usage of same listener ports.
This CR provides a property based workaround for following issue:
In a dual stack IPv4 and IPv6 system the port numbers returned by the system API, say port 1234 for IPv6 does not mean that port 1234 for IPv4 is also available. ORB is missing this check and thus we are able to start a Server on port ipv4:1234 and start another Server on port ipv6:1234. Ideally, only one particular server should be able to bind to port 1234 regardless of which address family stack is being used (i.e. IPv4 or IPv6).
CR7977 provides a workaround that enforces VisiBroker C++ to use IPv4 addresses thereby ensuring that all ports obtained are truly unique. This property help enforce the use of either of the address families.
Steps to disable the usage of IPv6
1. The fix for CR7977 is available in VB6.5 SP12 and VB7.0 SP1 or later.
2. Start the VBC65 Server with the following properties:
3. The "lsof" output should look something like this:
Server 5144 lsilva 10u? IPv4 0x300003b1cb8 0t0 TCP *:63420 (LISTEN)
Server 5330 lsilva 10u? IPv4 0x300010c27c8 0t0 TCP *:63421 (LISTEN)
Notice that the second Server is started on port 63421.
Please note that the "vbroker.connection.onlyListenIPv4" property is removed from the VisiBroker 8.5 C++ onwards to support "Pure" IPv6 deployment environment. It is superseded by the new property:
Related article: [[knowledge_base:Disable IPv6 Lookups|Disable IPv6 Lookups]]