Ошибка при попытке передать (большое) изображение через сокет в Python - PullRequest
1 голос
/ 19 сентября 2009

Я пытаюсь передать изображение через гнездо python для небольших изображений, оно работает нормально, но для больших изображений выдает ошибку как

socket.error: [Errno 10040] Сообщение, отправленное на сокете дейтаграммы, было больше внутренний буфер сообщений или какой-то другой предел сети, или буфер, используемый для приема дейтаграммы, был меньше самой дейтаграммы

Я использую

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

Спасибо за любую подсказку.

Я пытался использовать SOCK_STREAM, он не работает .. Он просто говорит, что я запускаюсь ... и зависает. без выхода .. Его функция выхода не выходит

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()

Ответы [ 2 ]

5 голосов
/ 19 сентября 2009

Ваше изображение слишком велико для отправки в одном UDP-пакете. Вам необходимо разделить данные изображения на несколько пакетов, которые отправляются индивидуально.

Если у вас нет особых причин использовать UDP, вы также можете использовать TCP, указав socket.SOCK_STREAM вместо socket.SOCK_DGRAM. Там вам не нужно беспокоиться о размерах пакетов и порядке.

2 голосов
/ 19 сентября 2009

Сообщение, которое вы отправляете, усекается .

Так как вы не показали фактический код, который send s, я предполагаю, что вы пытаетесь записать все изображение в сокет. Вам придется разбить изображение на несколько небольших кусков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...