我正在尝试通过 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()
您的图像太大,无法在一个 UDP 数据包中发送。您需要将图像数据拆分为多个数据包,然后单独发送。
如果您没有特殊原因使用 UDP,您也可以通过指定
socket.SOCK_STREAM
而不是 socket.SOCK_DGRAM
来使用 TCP。在那里您不必担心数据包大小和订购。
数据,地址 = self.serverSocket.recvfrom(1024) <<< increase this