Gistrec

Broadcast File Transfer

Oct 18th, 2018
286
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.  СЕРВЕР
  3.  
  4. #!/usr/bin/env python
  5. # -*- coding: utf-8 -*-
  6.  
  7. import socket
  8. import time
  9. import struct
  10.  
  11. # Пакет сообщает о новом файле
  12. # Структура пакета:
  13. #     Magic    (4 байта)
  14. #     FileSize (4 байта) - размер файла в блоках  
  15. MAGIC_NEW = b'\xa1\xdc\xda\xaa'
  16.  
  17. # Пакет с данными о файле
  18. # Структура пакета:
  19. #     Magic   (4 байта)
  20. #     Number  (4 байта) - номер пакета от 0 до FileSize
  21. MAGIC_TRANSFER = b'\xa1\xdc\xda\xab'
  22.  
  23. # Пакет, который приходит после передачи файла
  24. # Структура пакета:
  25. #     Magic   (4 байта)
  26. MAGIC_FINISH = b'\xa1\xdc\xda\xac'
  27.  
  28. # Пакет, который запрашивает блок данных файла
  29. # Структура пакета:
  30. #    Magic    (4 байта)
  31. #     Number  (4 байта) - номер пакета от 0 до FileSize
  32. MAGIC_ASK = b'\xa1\xdc\xda\xad'
  33.  
  34. # Размер передаваемых данных
  35. PACKET_SIZE = 2000;
  36.  
  37. # Создаем
  38. server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
  39. server.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
  40. # Set a timeout so the socket does not block
  41. # indefinitely when trying to receive data.
  42. server.settimeout(0.5)
  43. server.bind(("", 37021
  44.     ))
  45.  
  46. #filename = '/home/alex/Desktop/BFTP/file.test'
  47. filename = '/home/alex/file.test'
  48.  
  49. try:
  50.     f = open(filename, 'r', encoding="ISO-8859-1")
  51. except IOError:
  52.     print ("Error: File", filename, "not found")
  53.     server.close()
  54.     sys.exit(1)
  55. print("10")
  56. file_content = f.read()
  57. print("12")
  58. f.close()
  59.  
  60. fileBlocks = []
  61.  
  62. i = 0
  63. while file_content:
  64.     print(i)
  65.     i = i + 1
  66.     fileBlocks.append(file_content[:PACKET_SIZE])
  67.     file_content = file_content[PACKET_SIZE:]
  68.  
  69. message = MAGIC_NEW + len(fileBlocks).to_bytes(4, 'big')
  70. for i in range(0, 3):
  71.     time.sleep(1)
  72.     server.sendto(message, ('<broadcast>', 37021))
  73.  
  74. i = 0
  75. while i < len(fileBlocks):
  76.     print(len(fileBlocks[i]))
  77.     #if (i != 2 and i != 3):
  78.     send_data = MAGIC_TRANSFER + i.to_bytes(4, 'big') + len(fileBlocks[i]).to_bytes(4, 'big') + fileBlocks[i].encode()
  79.     server.sendto(send_data, ('<broadcast>', 37021))
  80.     i = i + 1
  81.  
  82. while True:
  83.     data, addr = server.recvfrom(1024)
  84.     magic = data[:4]
  85.  
  86.     print("read ", data)
  87.     # Если клиент зпрашивает какой-то блок
  88.     if (magic == MAGIC_ASK):
  89.         data = data[4:]
  90.         number = int.from_bytes(data[:4], 'big')
  91.  
  92.         print("Ask ", number, " part")
  93.  
  94.         send_data = MAGIC_TRANSFER + number.to_bytes(4, 'big') + len(fileBlocks[number]).to_bytes(4, 'big') + fileBlocks[number].encode()
  95.         server.sendto(send_data, ('<broadcast>', 37021))
  96.  
  97.     server.sendto(MAGIC_FINISH, ('<broadcast>', 37021))
  98.     time.sleep(0.5)
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  КЛИЕНТ
  106.  
  107. #!/usr/bin/env python
  108. # -*- coding: utf-8 -*-
  109.  
  110. # Windows
  111. # Показать mtu:    netsh interface ipv4 show subinterface
  112. # Установить mtu:  netsh interface ipv4 set subinterface "Подключение по локальной сети" mtu=10000 store=persistent
  113.  
  114. import socket
  115. import time
  116.  
  117. # Пакет сообщает о новом файле
  118. # Структура пакета:
  119. #     Magic    (4 байта)
  120. #     FileSize (4 байта) - размер файла в блоках  
  121. MAGIC_NEW = b'\xa1\xdc\xda\xaa'
  122.  
  123. # Пакет с данными о файле
  124. # Структура пакета:
  125. #     Magic   (4 байта)
  126. #     Number  (4 байта) - номер пакета от 0 до FileSize
  127. MAGIC_TRANSFER = b'\xa1\xdc\xda\xab'
  128.  
  129. # Пакет, который приходит после передачи файла
  130. # Структура пакета:
  131. #     Magic   (4 байта)
  132. MAGIC_FINISH = b'\xa1\xdc\xda\xac'
  133.  
  134. # Пакет, который запрашивает блок данных файла
  135. # Структура пакета:
  136. #    Magic    (4 байта)
  137. #     Number  (4 байта) - номер пакета от 0 до FileSize
  138. MAGIC_ASK = b'\xa1\xdc\xda\xad'
  139.  
  140. # Создание сокета
  141. client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
  142. client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
  143. client.bind(("", 37021))
  144. client.settimeout(0.5)
  145.  
  146. FileSize = 0
  147.  
  148. waitNewFile = True
  149. while waitNewFile:
  150.     try:
  151.         data, addr = client.recvfrom(10240)
  152.         magic = data[:4]
  153.         data = data[4:]
  154.  
  155.         if (magic == MAGIC_NEW):
  156.             waitNewFile = False
  157.             FileSize = int.from_bytes(data[:4], 'big')
  158.  
  159.             print("Get NEW_PACKET")            
  160.             print("Size: ", FileSize, " blocks!")
  161.     except:
  162.         print("Wait NEW_PACKET")    
  163.  
  164. fileBlocks = {}
  165.  
  166. for i in range(0, FileSize):
  167.     fileBlocks[i] = None;
  168.  
  169. # Сюда запишем блок, который нужно получить
  170. needReceiveBlock = 0
  171.  
  172. needReceiveFile = True;
  173. while needReceiveFile:
  174.     try:
  175.         data, addr = client.recvfrom(10240)
  176.         magic = data[:4]
  177.        
  178.         if (magic == MAGIC_TRANSFER):
  179.             data = data[4:]
  180.             number = int.from_bytes(data[:4], 'big')
  181.            
  182.  
  183.             data = data[4:]
  184.             length = int.from_bytes(data[:4], 'big')
  185.            
  186.  
  187.             print("Receive ", number, " part with length ", length)
  188.  
  189.             data = data[4:]
  190.             data = data[:length].decode()
  191.            
  192.             fileBlocks[number] = data
  193.  
  194.         if (magic == MAGIC_FINISH):
  195.             if (needReceiveBlock == (FileSize - 1)):
  196.                 try:
  197.                     f = open('C:/test.txt', "w")
  198.                     print(1)
  199.                     for i in range(0, FileSize - 1):
  200.                         f.write(fileBlocks[i])
  201.                     f.close()
  202.                     print("File successfully received")
  203.                     needReceiveFile = False
  204.                     break
  205.                 except IOError:
  206.                     print ("Error: filename not found")
  207.                     client.close()
  208.                     sys.exit(-1)
  209.             else:
  210.                 for i in range(needReceiveBlock, FileSize):
  211.                     if fileBlocks[i] == None:
  212.                         message = MAGIC_ASK + i.to_bytes(4, 'big')
  213.                         client.sendto(message, ('<broadcast>', 37021))
  214.                         print("Ask ",i, " part")
  215.                         time.sleep(0.5)
  216.                         raise ValueError("Need :) ")
  217.                     else:
  218.                         needReceiveBlock = i
  219.                     i = i + 1
  220.     except:
  221.         print("Wait file blocks!")
Advertisement
Comments
  • User was banned
Add Comment
Please, Sign In to add comment