2009-09-19 7 views
1

Je suis en train de passer d'une image sur la prise python pour des images plus petites, il fonctionne très bien, mais pour des images plus grandes, il donne erreurerreur en essayant de passer (grande) image sur la prise en python

socket.error: [Errno 10040 ] un message envoyé sur un socket datagramme était plus grande que le tampon de message interne ou d'une autre limite du réseau, ou le tampon utilisé pour recevoir un datagramme était plus petit que le datagramme lui-même

J'utilise

socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

Merci pour tout indice .

J'ai essayé d'utiliser SOCK_STREAM, ça ne marche pas .. Il me dit juste de commencer ... et se bloque. sans sortie .. Il ne sort pas de la fonction d'envoi

import thread 
import socket 
import ImageGrab 

class p2p: 
    def __init__(self): 
     socket.setdefaulttimeout(50) 
     #send port 
     self.send_port = 3000 
     #receive port 
     self.recv_port=2000 

     #OUR IP HERE 
     self.peerid = '127.0.0.1:' 
     #DESTINATION 
     self.recv_peers = '127.0.0.1' 

     #declaring sender socket 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.socket.bind(('127.0.0.1', self.send_port)) 
     self.socket.settimeout(50) 

     #receiver socket 
     self.serverSocket=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.serverSocket.bind(('127.0.0.1', self.recv_port)) 
     self.serverSocket.settimeout(50) 

     #starting thread for reception 
     thread.start_new_thread(self.receiveData,()) 

     #grabbing screenshot 
     image = ImageGrab.grab() 
     image.save("c:\\test.jpg") 
     f = open("c:\\ test.jpg", "rb") 
     data = f.read() 
     #sending 
     self.sendData(data) 
     print 'sent...' 
     f.close() 

     while 1: pass 

    def receiveData(self): 
     f = open("c:\\received.png","wb") 
     while 1: 
      data,address = self.serverSocket.recvfrom(1024) 
      if not data: break 
      f.write(data) 
     try: 
      f.close() 
     except: 
      print 'could not save' 
     print "received" 
    def sendData(self,data): 
     self.socket.sendto(data, (self.recv_peers,self.recv_port)) 
if __name__=='__main__': 
    print 'Started......'  
    p2p() 

Répondre

5

Votre image est trop volumineuse pour être envoyée dans un paquet UDP. Vous devez diviser les données d'image en plusieurs paquets envoyés individuellement.

Si vous n'avez pas de raison particulière d'utiliser UDP, vous pouvez également utiliser TCP en spécifiant socket.SOCK_STREAM au lieu de socket.SOCK_DGRAM. Là, vous n'avez pas à vous soucier de la taille des paquets et de la commande.

+0

J'ai essayé d'utiliser SOCK_STREAM, mais il ne sort pas de la fonction d'envoi. J'ai mis à jour ma question avec le programme actuel. J'avoue ne pas savoir comment l'utiliser. Y at-il d'autres changements nécessaires pour utiliser SOCK_STREAM, merci – Xinus

+0

son travail maintenant j'ai essayé le programme à http://docs.python.org/library/socket.html – Xinus

2

The message you are sending is being truncated.

Puisque vous n'avez pas montré le code réel send s, je suppose que vous essayez d'écrire toute l'image sur le socket. Vous devrez casser l'image en plusieurs morceaux plus petits.

Questions connexes