Created a new subclass of Exception called GAIException() that will
handle error messages from getaddrinfo() instead of letting Exception()
handle it. GAIException() will make use of gai_strerror() to map the
error code to text. On Windows, gai_strerrorW() must be used if the text
is encoded with UTF-8.
This makes it possible to create a derived class from Socket which is
not TCP based, without having VNCSConnectionST.cxx trying to call
setsockopt() on a non-socket.
Fix race problem with detecting listening inetd sockets
The previous detection would fail if the socket closed before we
had time to inspect it, which got us stuck in a loop as we would
try (and fail) to do accept() on a non-listening socket.
Fix race problem with detecting listening inetd sockets
The previous detection would fail if the socket closed before we
had time to inspect it, which got us stuck in a loop as we would
try (and fail) to do accept() on a non-listening socket.
It is easier to control object life time and avoid magical socket
duplication by having a single TcpListener object to pass around.
We have to be more careful about deleting the object though.
It is needed by WinVNC, but got removed in 892d10a70. Also fix
a couple of issues:
- Use getnameinfo() in order to be compatible with Windows XP
- Make it static since it doesn't use a specific socket
- Respect UseIPv4 and UseIPv6
- Flags for getaddrinfo() that match binding code
- Dummy service value for Windows compatibility
The TcpListener constructor now takes a 'struct sockaddr*' instead of
a string, and the createTcpListeners function creates TcpListener
instances for an address based on the results from getaddrinfo().
The XserverDesktop class now takes a list of TcpListener instances for
each of the RFB and HTTP sockets.
The TcpListener::closeFd member variable is not used and has been
removed.
Expose Linux' cork functionality which allows us to aggregate TCP data in a
controlled manner. Unfortunately there is no equivalent for Windows.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4781 3789f03b-4d11-0410-bbf8-ca57d06f2519
Using a fixed port range with -via can cause a race condition between multiple vncviewer instances, whereby one instance calls bind() and finds the port to be free, then another instance calls bind() and finds the same port to be free, because the first instance hasn't started the SSH tunnel on it yet. This patch works around the issue by using ephemeral ports. All known modern O/S's increment the ephemeral port number by 1 after bind(), so the port is effectively "reserved" after bind(), and this prevents another vncviewer instance from trying to reserve the same port.