【问题标题】:Error trying to pass (large) image over socket in python尝试通过 python 中的套接字传递(大)图像时出错
【发布时间】:2009-09-19 03:52:22
【问题描述】:

我正在尝试通过 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()

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    您的图片太大,无法在一个 UDP 数据包中发送。您需要将图像数据拆分为多个单独发送的数据包。

    如果您没有使用 UDP 的特殊原因,您也可以通过指定 socket.SOCK_STREAM 而不是 socket.SOCK_DGRAM 来使用 TCP。在那里您不必担心数据包大小和顺序。

    【讨论】:

    • 我尝试使用 SOCK_STREAM,但它并没有脱离发送功能。我用实际程序更新了我的问题。我承认不知道怎么用。使用 SOCK_STREAM 是否需要任何其他更改,谢谢
    【解决方案2】:

    The message you are sending is being truncated.

    由于您没有显示sends 的实际代码,我猜您正在尝试将整个图像写入套接字。您必须将图像分成几个更小的块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 2021-06-29
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      相关资源
      最近更新 更多