View difference between Paste ID: dLupXWMi and d3W3Lvdk
SHOW: | | - or go back to the newest paste.
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!")