Re: Passing a GUI handle to a socket and Postmessage back to GUI
"Scott McPhillips [MVP]" <org-dot-mvps-at-scottmcp> wrote in message
"KW" <KW@there.com> wrote in message
I have more questions for those who can help.
There will be approximately 12 clients connecting to my server.
The traffic on these connections will be VERY low.
When I call create(portnum), all clients connect to this port. I would
like to keep track of which station is actually connected at any given
time. I know I can use GetPeerName() to get the IP of the connected
client (which would ID the client), but I wonder if I may need to use a
different port number if the client IP was changed without my knowledge.
If the network uses DHCP then client IPs are likely to change from day to
day. Why not have the clients send a message that identifies them in some
I will keep this idea in mind. However, I may have no input on what messages
are sent by the clients. I'm just trying to get ahead of the curve and cover
the worse case scenario.
If the IP changed, the client would still connect to port nnnn, which
would still allow me to ID the client - I think.
In this scenario, would it be better for me to listen on different
ports for each client?
IMO, that just gives you another configuration setting and something else
to go wrong.
I would like to leave this out, but I am not yet sure on how to ID each
client (see next response).
Also, the server might need to respond to application level keep alives
(adding to a configuration file: Keepalives TRUE/FALSE). I already have
this in place. I just "ACK" the "KA" when received. My question involves
the scenario where a keepalive is not received within a given amount of
time (NO FD_CLOSE). I would need to close a specific connection and begin
listening again. Setting up a timer for each connection is problematic
because the is no CWnd in my CAsyncSocket class.
Will the connection eventually "die" if there is an abnormal disconnect?
It can take a long time for a connection to die. Your own keepalives are
the best way to do it. The timer problem should be trivial: One timer in
the app's main window should be sufficient. Have it call each active
socket object, which increments a counter to detect timeout.
Creating a timer in the main window: No problem.
Calling each active socket: Not sure how this would be accomplished.
The "main" window code:
sockServ = new MySocket(CWnd::m_hWnd);
"MySocket" is the listener class. "CServer" is where the socket is bound.
I would need ID each client from the "CSocketActivity" window so I could use
a timer there.
Do you have any tips on how I could ID each connection from the
Scott McPhillips [VC++ MVP]