Small socket problem

John O'Hagan research at johnohagan.com
Tue Feb 10 00:14:19 EST 2009


On Mon, 9 Feb 2009, Gabriel Genellina wrote:
> En Mon, 09 Feb 2009 07:43:36 -0200, John O'Hagan <research at johnohagan.com>
>
> escribió:
> > I'm using the socket module (python 2.5) like this (where 'options'
> > refers to
> > an optparse object) to connect to the Fluidsynth program:
> >
> >             host = "localhost"
> >             port = 9800
> >             fluid = socket(AF_INET, SOCK_STREAM)
> >             try:
> >                 fluid.connect((host, port))  #Connect if fluidsynth is
> > running
> >             except BaseException:
> >                 print "Connecting to fluidsynth..." #Or start fluidsynth
> >                 soundfont =  options.soundfont
> >                 driver = options.driver
> >                 Popen(["fluidsynth", "-i", "-s", "-g", "0.5",
> >                 "-C", "1",  "-R", "1", "-l", "-a", driver, "-j",
> > soundfont])
> >                 timeout = 50
> >                 while 1:
> >                     timeout -= 1
> >                     if timeout == 0:
> >                         print "Problem with fluidsynth: switching to
> > synth."
> >                         play_method = "synth"
> >                         break
> >                     try:
> >                         fluid.connect((host, port))
> >                     except BaseException:
> >                         sleep(0.05)
> >                         continue
> >                     else:
> >                         break
> >
> > (I'm using BaseException because I haven't been able to discover what
> > exception class[es] socket uses).
>
> Usually socket.error, which is a subclass of IOError, but others might
> happen too I think. In any case, the most generic except clause you should
> use is
> try:
> except Exception: ...
> (because you usually don't want to catch KeyboardInterrupt nor SystemExit,
> that is, let Ctrl-C and sys.exit() do their work)

Thanks, I had been doing "from socket import foo, bar" without 
importing "error", that now works. I think I should use that specific 
exception in the try clause for now so I can see any other exceptions that 
may occur, a good idea?

>
> > The problem is that this fails to connect ( the error is "111: Connection
> > refused") the first time I run it after booting if fluidsynth is not
> > already
> > running, no matter how long the timeout is; after Ctrl-C'ing out of the
> > program, all subsequent attempts succeed. Note that fluidsynth need not
> > be
> > running for a success to occur.
>
> Always the same exception? In both lines?

Yes; I'm sure this is obvious, but just for clarity: if fluidsynth is not 
running I expect that error at the first line where connection is attempted, 
and at the second line during the loop while fluidsynth is loading (this 
takes 0.5-5 seconds depending on the size of the soundfont it's using). But I 
don't understand why the connection is still refused once fluidsynth has 
finished loading.

I received an off-list reply to this post to the effect that attempting to 
reuse a socket on which a connection attempt has failed, will fail, and that 
I needed to create a new socket for each attempt. It seemed very plausible, 
so I tried inserting a fresh

fluid = socket(AF_INET, SOCK_STREAM)

before the second fluid.connect() in the loop; but this still behaved the same 
way. Is that the way to do it?

Annoyingly, I've so far only been able reproduce the problem by rebooting.

Regards,

John



More information about the Python-list mailing list