Windows service using the socket module

J

JDF

I am fairly new to python and seem to have gotten ahead of myself. I
am trying to write a Windows service that will return the current
number of Citrix sessions to a client. This service will run on my
Citrix servers for usage tracking purposes.

The service itself seems to function properly, it starts, stops, logs
to the event viewer, etc. The problem seems to be with the portion
where it either waits to be stopped or waits for remote connection - it
does not get to the 'wait for remote connection' part.

If I remove the 'wait for stop request' portion the service will return
the session count but of course I can't stop the service nicely.

Does anyone have some example code I could take a look at or some
advice to get me back on track?

thanks in advance,
John

s = socket.socket()
hostIP = socket.gethostbyaddr(socket.gethostname())[2][0]
if debug == 'true': servicemanager.LogInfoMsg('Host IP: ' +
str(hostIP))
s.bind((hostIP, port))

while 1:
# Wait for either a connection, or a service stop request.
timeout = win32event.INFINITE
waitHandles = self.hWaitStop, self.overlapped.hEvent
rc = win32event.WaitForMultipleObjects(waitHandles, 0, timeout)
if rc == win32event.WAIT_OBJECT_0:
# Stop event
break
else:
s.listen(5)
while True:
sessions = 0
qwinstaOut = os.popen(qwinstaCmd).readlines()
for line in qwinstaOut:
## Look for active ICA sessions
if (((re.search("ICA", line, re.IGNORECASE)):
sessions = sessions + 1
c, addr = s.accept()
## Send session count
c.send(str(sessions))
c.close()
 
D

Dennis Lee Bieber

On 6 Nov 2005 12:26:07 -0800, "JDF" <[email protected]> declaimed the
following in comp.lang.python:

You left off the important stuff... Like the class definition, since
you reference "self." -- there is nothing here to tell where
self.hWaitStop or self.overlapped.hEvent are created/defined.
s = socket.socket()
hostIP = socket.gethostbyaddr(socket.gethostname())[2][0]
if debug == 'true': servicemanager.LogInfoMsg('Host IP: ' +
str(hostIP))
s.bind((hostIP, port))

while 1:
# Wait for either a connection, or a service stop request.
timeout = win32event.INFINITE
waitHandles = self.hWaitStop, self.overlapped.hEvent

Given the above comment, I'm surprised anything works... Where is
the overlapped I/O event queued?
rc = win32event.WaitForMultipleObjects(waitHandles, 0, timeout)
if rc == win32event.WAIT_OBJECT_0:
# Stop event
break
else:
s.listen(5)
while True:
sessions = 0
qwinstaOut = os.popen(qwinstaCmd).readlines()
for line in qwinstaOut:
## Look for active ICA sessions
if (((re.search("ICA", line, re.IGNORECASE)):
sessions = sessions + 1
c, addr = s.accept()
## Send session count
c.send(str(sessions))
c.close()

I'd be wary of mixing basic socket operations with Windows I/O event
scheme... But maybe that is handled in the missing code.

And how would you expect to get out of that inner loop? There is no
"break" so if the code ever gets to the s.listen() call (and past it) it
will never get back to the top loop with the event wait. Someone else
will have to clarify -- but isn't s.accept() a blocking call itself?

If the I/O doesn't play nice together, it may be better to put the
socket handling into a thread with a time-out select() call, so the
thread can periodically test for the presense of a shutdown flag. The
main program would do the wait for the shutdown, set the flag so the
thread can see it -- the thread would then close up its stuff and
return(exit); the main would be waiting on thread.join() so it knows
when things are clean enough to exit itself.
--
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,781
Messages
2,569,615
Members
45,294
Latest member
LandonPigo

Latest Threads

Top