Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1483 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  [socket] un socket.receive() non bloquant ....

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[socket] un socket.receive() non bloquant ....

n°716507
pi3r
Posté le 05-05-2004 à 16:54:02  profilanswer
 

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  :cry:  
 
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 :
  1. def __init__(self,host=socket.gethostname(),port=10000):
  2.     self.host,self.rhost=host,host
  3.     self.port,self.rport=port,port
  4.     try:
  5.       print 'Creating Socket'
  6.       self.Socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  7.       self.Socket.settimeout(1.0)
  8.     except socket.error:
  9.       print 'Failed to create Socket object !'
  10.     try:
  11.       print 'Binding Socket'
  12.       self.Socket.bind((self.host,self.port))
  13.       print self
  14.     except socket.error:
  15.       print 'unable to bind '+str(self.host)+' on port '+str(self.port)
  16.   def Listen(self,msg='Accepted Connection from:'):
  17.     print 'Listening to port ',self.port
  18.     self.Socket.listen(1)
  19.     try:
  20.       self.conn,self.rhost=self.Socket.accept()
  21.       self.rhost=self.rhost[0]
  22.     except socket.timeout:
  23.       print 'no available connection, doing something else'
  24.       self.somethingElse()
  25.       return 0
  26.     if self.rhost:
  27.       print 'Got connection from',self.rhost
  28.       print msg,self.rhost
  29.       return 1
  30.   def Receive(self,size=65534):
  31.     try:
  32.       print 'Receiving data...'
  33.       received=self.conn.recv(size)
  34.       print 'received ',len(received)
  35.       return received
  36.     except socket.timeout:
  37.       print 'no data to receive, doing something else'
  38.       self.somethingElse()
  39.       return None
  40.   def main(self):
  41.     while self.Listen()!=1:
  42.       print 'main: listen one more time ...'
  43.     print 'main: ok, seemed to be connected now ;)'
  44.     while self.Receive()==None:
  45.       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

mood
Publicité
Posté le 05-05-2004 à 16:54:02  profilanswer
 

n°716541
SoWhatIn22
Posté le 05-05-2004 à 17:10:25  profilanswer
 

c'est curieux, cela devrait fonctionner...
essaye peut être de voir du côté de select.select() ?

n°716553
Taz
bisounours-codeur
Posté le 05-05-2004 à 17:14:32  profilanswer
 

j'ai pas testé ton exemple, mais  
 
tu mélange timeout et blocking, je suis sur que ça foir ...
 
en mode non bloquant, quand y a rien à lire, ça retourne pas rien, ça lance une exception socket.error

n°716555
pi3r
Posté le 05-05-2004 à 17:15:26  profilanswer
 

humm, bonne idée, je vais chercher de ce côté ...

n°716579
pi3r
Posté le 05-05-2004 à 17:24:23  profilanswer
 

Taz a écrit :

j'ai pas testé ton exemple, mais  
 
tu mélange timeout et blocking, je suis sur que ça foir ...
 
en mode non bloquant, quand y a rien à lire, ça retourne pas rien, ça lance une exception socket.error


 
oui c vrai, ce que je voudrais faire, c'est faire un receive de tps en tps or le receive n'accepte pas le timeout ....  maintenant je pourrai me mettre en mode non bloquant mais comment créer une boucle pour faire ce receive à intervalle régulier ??

n°716584
Taz
bisounours-codeur
Posté le 05-05-2004 à 17:26:38  profilanswer
 

tu fais des pauses et voilà

n°716593
pi3r
Posté le 05-05-2004 à 17:31:39  profilanswer
 

des pauses, cad ?

n°716597
Taz
bisounours-codeur
Posté le 05-05-2004 à 17:35:05  profilanswer
 

time.sleep(1.1)

n°716618
pi3r
Posté le 05-05-2004 à 17:50:22  profilanswer
 

Taz a écrit :

time.sleep(1.1)


 
ha ok c'est tout con effectivement (désolé je débute en python), ms j'ai lu :

Citation :

sleep(secs)  Suspends execution for secs seconds. secs can be a float.


 
et ça ve dire que mon prog va arreter de tourner pdt 'secs', non ?
or justement je veux qu'il tourne et puis qu'il fasse le receive tous les 'laps' ....

n°716630
Taz
bisounours-codeur
Posté le 05-05-2004 à 18:04:47  profilanswer
 

ben ton thread reçoit et dors voilà

mood
Publicité
Posté le 05-05-2004 à 18:04:47  profilanswer
 

n°716642
pi3r
Posté le 05-05-2004 à 18:18:11  profilanswer
 

Taz a écrit :

ben ton thread reçoit et dors voilà


 
oui ms justement, g pas de thread et je dois pas en utiliser, ms bon je vais me débrouiller avec tout ça.
 
merci à vs 2 pour les réponses  :jap:  
 
++
vince

n°716643
Taz
bisounours-codeur
Posté le 05-05-2004 à 18:19:26  profilanswer
 

dtc .. tu vas faire un programme sous efficace et consommateur de CPU

n°717063
BenO
Profil: Chercheur
Posté le 06-05-2004 à 10:37:30  profilanswer
 

euhh, a priori , ton programme est un thread :p que tu le veuilles ou non.
à confirmer ^^

n°717275
Taz
bisounours-codeur
Posté le 06-05-2004 à 13:54:44  profilanswer
 

...

n°759511
Phod
Glouloulou ?
Posté le 10-06-2004 à 17:14:37  profilanswer
 

C'est un peu tard, mais ca sera peut etre kan meme utile a kkun...
 
pour eviter le thread tout en concervant une vitesse d'excution correct de ton code tu utilise un compteur + un time.sleep avec une toute petite tempo !
 
genre :
 

Code :
  1. cpt=0
  2.   while(1):
  3.     ...
  4.     time.sleep(0.01)
  5.     cpt=cpt+0.01
  6.     if cpt == 5: # pour tester ton socket toutes les 5 secondes
  7.       socket.receive(...)
  8.       cpt=0
  9.     ...
  10.     suite du traitement
  11.     ...


 
vala ;)


Message édité par Phod le 10-06-2004 à 17:16:49

---------------
Signatures aux choix Votez:  O - Le python c'est bon, mangez-en  O - L'abus de forum rend dependant, postez avec modération
n°759518
Taz
bisounours-codeur
Posté le 10-06-2004 à 17:18:00  profilanswer
 

n'importe quoi ...

n°759521
Phod
Glouloulou ?
Posté le 10-06-2004 à 17:21:48  profilanswer
 

c'est peut etre pas tres elegant mais :
 
c'est ppas compliqué, y a pas de thread et ca ralenti pas 'trop' le reste du traitement.
 
tu aurai fait comment toi ?


---------------
Signatures aux choix Votez:  O - Le python c'est bon, mangez-en  O - L'abus de forum rend dependant, postez avec modération
n°759536
Taz
bisounours-codeur
Posté le 10-06-2004 à 17:31:07  profilanswer
 

tu plaisantes là ?

n°759542
Phod
Glouloulou ?
Posté le 10-06-2004 à 17:34:52  profilanswer
 

ben non. si tu critique mon truc (qui je le reconnais est n'est pas tres 'clean') c'est que tu pense a mieu non ?


Message édité par Phod le 10-06-2004 à 17:35:23

---------------
Signatures aux choix Votez:  O - Le python c'est bon, mangez-en  O - L'abus de forum rend dependant, postez avec modération

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  [socket] un socket.receive() non bloquant ....

 

Sujets relatifs
besoin d'aide pour la fonction socket probleme avec free[resolu tout seul ^^] Probleme avec socket & printf
problème socket unix - lecture[C++] Socket - envoyer URL
Lecture du clavier non bloquantSocket et Packet en C
[Question] Socket (résolu)recv non bloquant en progra socket (connected)
Plus de sujets relatifs à : [socket] un socket.receive() non bloquant ....


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR