Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- СЕРВЕР
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import socket
- import time
- import struct
- # Пакет сообщает о новом файле
- # Структура пакета:
- # 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'
- # Размер передаваемых данных
- PACKET_SIZE = 2000;
- # Создаем
- server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
- server.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
- # Set a timeout so the socket does not block
- # indefinitely when trying to receive data.
- server.settimeout(0.5)
- server.bind(("", 37021
- ))
- #filename = '/home/alex/Desktop/BFTP/file.test'
- filename = '/home/alex/file.test'
- try:
- f = open(filename, 'r', encoding="ISO-8859-1")
- except IOError:
- print ("Error: File", filename, "not found")
- server.close()
- sys.exit(1)
- print("10")
- file_content = f.read()
- print("12")
- f.close()
- fileBlocks = []
- i = 0
- while file_content:
- print(i)
- i = i + 1
- fileBlocks.append(file_content[:PACKET_SIZE])
- file_content = file_content[PACKET_SIZE:]
- message = MAGIC_NEW + len(fileBlocks).to_bytes(4, 'big')
- for i in range(0, 3):
- time.sleep(1)
- server.sendto(message, ('<broadcast>', 37021))
- i = 0
- while i < len(fileBlocks):
- print(len(fileBlocks[i]))
- #if (i != 2 and i != 3):
- send_data = MAGIC_TRANSFER + i.to_bytes(4, 'big') + len(fileBlocks[i]).to_bytes(4, 'big') + fileBlocks[i].encode()
- server.sendto(send_data, ('<broadcast>', 37021))
- i = i + 1
- while True:
- data, addr = server.recvfrom(1024)
- magic = data[:4]
- print("read ", data)
- # Если клиент зпрашивает какой-то блок
- if (magic == MAGIC_ASK):
- data = data[4:]
- number = int.from_bytes(data[:4], 'big')
- print("Ask ", number, " part")
- send_data = MAGIC_TRANSFER + number.to_bytes(4, 'big') + len(fileBlocks[number]).to_bytes(4, 'big') + fileBlocks[number].encode()
- server.sendto(send_data, ('<broadcast>', 37021))
- server.sendto(MAGIC_FINISH, ('<broadcast>', 37021))
- time.sleep(0.5)
- КЛИЕНТ
- #!/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