I decided the socket pool approach was more overhead than I wanted to attempt
right now, so I went back to my single socket loop.
I switched to a while-do loop, and now have this working as shown below, but
the odd thing is that each receiver seems to be getting the command string
twice. I can see that in the remote service log. I do have the service coded to
close the connection after receiving this particular command.
for Counter := 0 to StoreCounter-1 do
WSocket1.Addr := FieldByName('StoreNumber').AsString;
WSocket1.Port := M5Port;
while WSocket1.State <> wsClosed do
---- "Jörg Fischer" <tur...@gmx.de> wrote:
> Am 11.07.2017 um 20:53 schrieb kmille...@woh.rr.com:
> > From the sound of it the socket pool approach certainly looks like the way
> > to go. I am dealing with a bit less than 300 potential servers
> > for this process. I tried a version of the "wait until it's closed"
> > approach, but all that ever did was lock up the application, no doubt
> > because I wrote it incorrectly in the first place. :)
> Have a look at how TWSocketServer handles its Client Connections: It
> just keeps a list of all TWSocketClient Objects,
> e.g. in TCustomWSocketServer.TriggerSessionAvailable(),
> Unfortunately this is the reverse of what you wanted to do, so you
> cannot simply use this class.
> Personally I would not bother too much with connection pooling below
> about a 1000 connections, but you could simply check how many items this
> list already has.
> J. Fischer
> > I have no idea, however, how to go about creating or using a pool such as
> > you describe. I've really only ever dealt with a single client/server pair
> > on anything other than the Indy components. Would you be so kind as to
> > point me toward some resource, example, or tutorial on this subject?
> > ---- Angus Robertson - Magenta Systems Ltd <an...@magsys.co.uk> wrote:
> >>> This new version has presented me with a problem. I can
> >>> successfully connect to the first device in the list, and send
> >>> the command in the OnConnected event. Through reading comments in
> >>> the source, I understand that the problems originated with the
> >>> way I'm handling this.
> >>> After the first connect, I try to do the next, which, I can see,
> >>> is the problem. I cannot change the address because that original
> >>> connection is still open.
> >> You are using async functions, and trying to start a second connection
> >> on the socket before the first has closed.
> >> You either need to check in your loop that the socket state is closed
> >> already and wait until it is, or create an array of TWSockets so you
> >> can send these several messages in parallel.
> >> The big problem with TCP/IP is connection timeouts, it will usually
> >> wait 30 to 60 seconds attempting to make a connection before giving an
> >> error, which can slow down your messaging dramatically with a single
> >> socket.
> >> So multiple sockets is the way to go. You don't say how many devices
> >> you are dealing with, if it's dozens then one wsocket each is trivial,
> >> if it's hundreds or thousands you probably want to create a socket pool
> >> of maybe 100 wsockets and use them as they come free.
> >> Windows can only open so many new sockets per second, particularly if
> >> you are using SSL, thus the pool.
> >> All the sockets can share the same event handlers, when you create them
> >> set the Tag property to the counter number and check Tag in the event
> >> so you know what data to send.
> >> Angus
> >> --
> >> To unsubscribe or change your settings for TWSocket mailing list
> >> please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
> >> Visit our website at http://www.overbyte.be
> To unsubscribe or change your settings for TWSocket mailing list
> please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
> Visit our website at http://www.overbyte.be
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be