Guest User

Untitled

a guest
Oct 18th, 2018
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.73 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. # Windows
  5. # Показать mtu: netsh interface ipv4 show subinterface
  6. # Установить mtu: netsh interface ipv4 set subinterface "Подключение по локальной сети" mtu=10000 store=persistent
  7.  
  8. import socket
  9. import time
  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. client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
  36. client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
  37. client.bind(("", 37021))
  38. client.settimeout(0.5)
  39.  
  40. FileSize = 0
  41.  
  42. waitNewFile = True
  43. while waitNewFile:
  44. try:
  45. data, addr = client.recvfrom(10240)
  46. magic = data[:4]
  47. data = data[4:]
  48.  
  49. if (magic == MAGIC_NEW):
  50. waitNewFile = False
  51. FileSize = int.from_bytes(data[:4], 'big')
  52.  
  53. print("Get NEW_PACKET")
  54. print("Size: ", FileSize, " blocks!")
  55. except:
  56. print("Wait NEW_PACKET")
  57.  
  58. fileBlocks = {}
  59.  
  60. for i in range(0, FileSize):
  61. fileBlocks[i] = None;
  62.  
  63. # Сюда запишем блок, который нужно получить
  64. needReceiveBlock = 0
  65.  
  66. needReceiveFile = True;
  67. while needReceiveFile:
  68. try:
  69. data, addr = client.recvfrom(10240)
  70. magic = data[:4]
  71.  
  72. if (magic == MAGIC_TRANSFER):
  73. data = data[4:]
  74. number = int.from_bytes(data[:4], 'big')
  75.  
  76.  
  77. data = data[4:]
  78. length = int.from_bytes(data[:4], 'big')
  79.  
  80.  
  81. print("Receive ", number, " part with length ", length)
  82.  
  83. data = data[4:]
  84. data = data[:length].decode()
  85.  
  86. fileBlocks[number] = data
  87.  
  88. if (magic == MAGIC_FINISH):
  89. if (needReceiveBlock == (FileSize - 1)):
  90. try:
  91. f = open('C:/test.txt', "w")
  92. print(1)
  93. for i in range(0, FileSize - 1):
  94. f.write(fileBlocks[i])
  95. f.close()
  96. print("File successfully received")
  97. needReceiveFile = False
  98. break
  99. except IOError:
  100. print ("Error: filename not found")
  101. client.close()
  102. sys.exit(-1)
  103. else:
  104. for i in range(needReceiveBlock, FileSize):
  105. if fileBlocks[i] == None:
  106. message = MAGIC_ASK + i.to_bytes(4, 'big')
  107. client.sendto(message, ('<broadcast>', 37021))
  108. print("Ask ",i, " part")
  109. time.sleep(0.5)
  110. raise ValueError("Need :) ")
  111. else:
  112. needReceiveBlock = i
  113. i = i + 1
  114. except:
  115. print("Wait file blocks!")
Advertisement
Add Comment
Please, Sign In to add comment