pi3r | slt a tous,
voila je fais une appli en python qui reçoit des instructions de tps en tps et j'ai une restriction assez sérieuse : ne pas utiliser de thread !
Donc il faudrait que je puisse faire un receive de tps en tps pour vérifier si des instructions sont arrivées mais la méthode socket.receive() est bloquante donc mon prog arrête de tourner tant qu'il n'a rien reçu Mon idée était de combiner le timeout et 1 boucle while mais ça ne fonctionne pas .... bon place au bout de code, ce sera + compréhensible :
Code :
- def __init__(self,host=socket.gethostname(),port=10000):
- self.host,self.rhost=host,host
- self.port,self.rport=port,port
- try:
- print 'Creating Socket'
- self.Socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- self.Socket.settimeout(1.0)
- except socket.error:
- print 'Failed to create Socket object !'
- try:
- print 'Binding Socket'
- self.Socket.bind((self.host,self.port))
- print self
- except socket.error:
- print 'unable to bind '+str(self.host)+' on port '+str(self.port)
- def Listen(self,msg='Accepted Connection from:'):
- print 'Listening to port ',self.port
- self.Socket.listen(1)
- try:
- self.conn,self.rhost=self.Socket.accept()
- self.rhost=self.rhost[0]
- except socket.timeout:
- print 'no available connection, doing something else'
- self.somethingElse()
- return 0
- if self.rhost:
- print 'Got connection from',self.rhost
- print msg,self.rhost
- return 1
- def Receive(self,size=65534):
- try:
- print 'Receiving data...'
- received=self.conn.recv(size)
- print 'received ',len(received)
- return received
- except socket.timeout:
- print 'no data to receive, doing something else'
- self.somethingElse()
- return None
- def main(self):
- while self.Listen()!=1:
- print 'main: listen one more time ...'
- print 'main: ok, seemed to be connected now ;)'
- while self.Receive()==None:
- print 'main: receive one more time ...'
|
Un exemple d'exécution donnerait ça :
Citation :
Creating Socket
Binding Socket
Socket bound to Host=zsdev001,Port=10000
Listening to port 10000
no available connection, doing something else
hi! im doing something else
main: listen one more time ...
Listening to port 10000
no available connection, doing something else
hi! im doing something else
main: listen one more time ...
Listening to port 10000
Got connection from 192.168.1.130
Accepted Connection from: 192.168.1.130
main: ok, seemed to be connected now
Receiving data...
Traceback (most recent call last):
File "D:\zap-Lib\serv.py", line 69, in main
while self.Receive()==None:
File "D:\zap-Lib\serv.py", line 51, in Receive
received=self.conn.recv(size)
socket.error: (10035, 'The socket operation could not complete without blocking'
)
|
J'ai essayé de faire un self.Socket.setblocking(0) ms la methode receive reste bloquante ....
une idée ??
d'avance merci!
vince |