Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # Windows
- # Показать mtu: netsh interface ipv4 show subinterface
- # Установить mtu: netsh interface ipv4 set subinterface "Подключение по локальной сети" mtu=10000 store=persistent
- import socket
- import time
- # Пакет сообщает о новом файле
- # Структура пакета:
- # Magic (4 байта)
- # FileSize (4 байта) - размер файла в блоках
- MAGIC_NEW = b'\xa1\xdc\xda\xaa'
- # Пакет с данными о файле
- # Структура пакета:
- # Magic (4 байта)
- # Number (4 байта) - номер пакета от 0 до FileSize
- MAGIC_TRANSFER = b'\xa1\xdc\xda\xab'
- # Пакет, который приходит после передачи файла
- # Структура пакета:
- # Magic (4 байта)
- MAGIC_FINISH = b'\xa1\xdc\xda\xac'
- # Пакет, который запрашивает блок данных файла
- # Структура пакета:
- # Magic (4 байта)
- # Number (4 байта) - номер пакета от 0 до FileSize
- MAGIC_ASK = b'\xa1\xdc\xda\xad'
- # Создание сокета
- client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
- client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
- client.bind(("", 37021))
- client.settimeout(0.5)
- FileSize = 0
- waitNewFile = True
- while waitNewFile:
- try:
- data, addr = client.recvfrom(10240)
- magic = data[:4]
- data = data[4:]
- if (magic == MAGIC_NEW):
- waitNewFile = False
- FileSize = int.from_bytes(data[:4], 'big')
- print("Get NEW_PACKET")
- print("Size: ", FileSize, " blocks!")
- except:
- print("Wait NEW_PACKET")
- fileBlocks = {}
- for i in range(0, FileSize):
- fileBlocks[i] = None;
- # Сюда запишем блок, который нужно получить
- needReceiveBlock = 0
- needReceiveFile = True;
- while needReceiveFile:
- try:
- data, addr = client.recvfrom(10240)
- magic = data[:4]
- if (magic == MAGIC_TRANSFER):
- data = data[4:]
- number = int.from_bytes(data[:4], 'big')
- data = data[4:]
- length = int.from_bytes(data[:4], 'big')
- print("Receive ", number, " part with length ", length)
- data = data[4:]
- data = data[:length].decode()
- fileBlocks[number] = data
- if (magic == MAGIC_FINISH):
- if (needReceiveBlock == (FileSize - 1)):
- try:
- f = open('C:/test.txt', "w")
- print(1)
- for i in range(0, FileSize - 1):
- f.write(fileBlocks[i])
- f.close()
- print("File successfully received")
- needReceiveFile = False
- break
- except IOError:
- print ("Error: filename not found")
- client.close()
- sys.exit(-1)
- else:
- for i in range(needReceiveBlock, FileSize):
- if fileBlocks[i] == None:
- message = MAGIC_ASK + i.to_bytes(4, 'big')
- client.sendto(message, ('<broadcast>', 37021))
- print("Ask ",i, " part")
- time.sleep(0.5)
- raise ValueError("Need :) ")
- else:
- needReceiveBlock = i
- i = i + 1
- except:
- print("Wait file blocks!")
Advertisement
Add Comment
Please, Sign In to add comment