i have simple syslog receiver starts windows service. service starts fine... can't stop when hit "stop service". i'm sure it's because i'm bound socket. however, can't figure out how un-bind socket svcstop function. have ideas?
output_log_file = 'c:\temp\output.log' host = "192.168.x.x" port = 514 import socketserver import pythoncom import win32serviceutil import win32service import win32event import servicemanager import socket class appserversvc (win32serviceutil.serviceframework): _svc_name_ = "simple syslog receiver" _svc_display_name_ = "simple syslog receiver" server = "" def __init__(self, args): win32serviceutil.serviceframework.__init__(self, args) self.hwaitstop = win32event.createevent(none, 0, 0, none) socket.setdefaulttimeout(60) def svcstop(self): self.reportservicestatus(win32service.service_stop_pending) win32event.setevent(self.hwaitstop) def svcdorun(self): servicemanager.logmsg(servicemanager.eventlog_information_type, servicemanager.pys_service_started, (self._svc_name_,'')) self.main() def main(self): try: global server server = socketserver.udpserver((host, port), syslogudphandler) server.serve_forever(poll_interval=0.5) except (ioerror, systemexit): raise pass class syslogudphandler(socketserver.baserequesthandler): def handle(self): data = bytes.decode(self.request[0].strip()) open(output_log_file, 'w+') outputfile: outputfile.write(str(data)) outputfile.close() if __name__ == "__main__": win32serviceutil.handlecommandline(appserversvc)
same problem on windows 7 + virtualbox.
the solution have remove particular port being forwarded in virtualbox, or use new port.
even standard socket server code basic example has feature: 1. runs forever 2. can not see in windows processes 3. not "because bounded socket" continues replay properly, although python application closed.
import socket tcp_ip = '127.0.0.1' tcp_port = 80 buffer_size = 20 s = socket.socket(socket.af_inet, socket.sock_stream) s.bind((tcp_ip, tcp_port)) s.listen(1) conn, addr = s.accept() print 'connection address:', addr while 1: data = conn.recv(buffer_size) if not data: break print "received data:", data conn.send(data) # echo conn.close() s.close() raw_input()