Return TcpListener pointers rather than objects
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.
diff --git a/vncviewer/vncviewer.cxx b/vncviewer/vncviewer.cxx
index 230cc25..a2bc029 100644
--- a/vncviewer/vncviewer.cxx
+++ b/vncviewer/vncviewer.cxx
@@ -525,7 +525,7 @@
#endif
if (listenMode) {
- std::list<TcpListener> listeners;
+ std::list<TcpListener*> listeners;
try {
int port = 5500;
if (isdigit(vncServerName[0]))
@@ -539,10 +539,10 @@
while (sock == NULL) {
fd_set rfds;
FD_ZERO(&rfds);
- for (std::list<TcpListener>::iterator i = listeners.begin();
+ for (std::list<TcpListener*>::iterator i = listeners.begin();
i != listeners.end();
i++)
- FD_SET((*i).getFd(), &rfds);
+ FD_SET((*i)->getFd(), &rfds);
int n = select(FD_SETSIZE, &rfds, 0, 0, 0);
if (n < 0) {
@@ -554,11 +554,11 @@
}
}
- for (std::list<TcpListener>::iterator i = listeners.begin ();
+ for (std::list<TcpListener*>::iterator i = listeners.begin ();
i != listeners.end();
i++)
- if (FD_ISSET((*i).getFd(), &rfds)) {
- sock = (*i).accept();
+ if (FD_ISSET((*i)->getFd(), &rfds)) {
+ sock = (*i)->accept();
if (sock)
/* Got a connection */
break;
@@ -571,6 +571,10 @@
return 1;
}
+ while (!listeners.empty()) {
+ delete listeners.back();
+ listeners.pop_back();
+ }
} else {
if (vncServerName[0] == '\0') {
ServerDialog::run(defaultServerName, vncServerName);