Progress on preventing multiple instances of a program from running in windows

Alex Tweedly alex at tweedly.net
Fri Dec 3 13:18:30 EST 2004


At 12:59 03/12/2004 -0500, Lynch, Jonathan wrote:

>The fact that, on my windows XP computer, Rev is automatically setting
>itself up to listen to a port to which it just wrote a message seems
>awfully odd.
>
>My understanding of ports and sockets is weak - but shouldn't it be able
>to write to socket "127.0.0.1:48953" without setting itself up as
>listening to port 48953?

Yes, it should (and can - as verified by the echo server I sent earlier ....)

Your previous email implied something slightly different from what you say 
here or at least, I read it slightly differently ...)

You said then (my emphasis)

>What was happening was that BOTH INSTANCES WERE SET TO LISTEN to that
>port, but once the port was read by one instance, it was not read by the
>other.
>
>The solution is like this:
>Open socket to "127.0.0.1:48953"
>Write "QueryInstance" to socket "127.0.0.1:48953"
>Close socket "127.0.0.1:48953"
>Close socket "48953"

I think what you are seeing is some variant of the re-use socket problem. 
Because Rev is telling the OS to re-use the same socket address, things are 
acting a bit screwy.

I can't exactly explain what you're seeing - but I'm pretty sure there's 
something about reusing sockets behind it.  If you want to send a more 
complete code fragment, I can give it a try - but I suspect that port 
re-use will catch us out one way or another.

Note that my long post earlier (which first tried to open the port - and if 
that failed, only then went into server mode and did an Accept)  avoids the 
re-use issue completely, and should work on any OS.

>Is there a shell command for writing to a socket that could be used that
>might not have this behavior?

Nothing very convenient.

>My method of closing port 48953 after writing to "127.0.0.1:48953" (and
>doing the same with port 48954 for communicating in the reverse
>direction) works to allow two instances of a stack, running under two
>different instances of Rev, to communicate with each other - however,
>when I save the same stack as a standalone and try it with two instances
>of that standalone, they only manage to pass a couple messages before
>getting confused.

It's also quite inefficient (opening and closing ports). I wonder if it may 
be running into problems with Time-Wait (ports that are closed are put into 
a temporary time-wait state to avoid problems of late packet arrival - and 
that can cause problems when you are rapidly binding and closing the same 
port).

>If it were possible to write to socket without trying to steal the
>listening of that stack, it would be much easier.

Try the long code fragment I sent - I'm pretty sure it will work generally, 
and it definitely is OK on Windows (2000 and I also tested it on XP under 
Dreamcard Player).

-- Alex.


More information about the use-livecode mailing list