python 간단 한 tftp 구현(udp 프로 토 콜 기반)
tftp 는 udp 기반 프로 토 콜 입 니 다
from threading import Thread
from socket import *
import struct
def upload(filename,user_ip,user_port):
num = 0
f = open(filename,'ab')
s_up = socket(AF_INET,SOCK_DGRAM)
send_data_1 = struct.pack("!HH",4,num)
s_up.sendto(send_data_1,(user_ip,user_port)) #
while True:
recv_data,user_info = s_up.recvfrom(1024) #
caozuohao_up,ack_num = struct.unpack('!HH',recv_data[:4])
print(caozuohao_up,ack_num,num)
if int(caozuohao_up) == 3 and ack_num == num :
f.write(recv_data[4:])
send_data = struct.pack("!HH",4,num)
s_up.sendto(send_data,(user_ip,user_port)) #
num = num + 1
if len(recv_data) < 516:
print(user_ip+' '+filename+': ')
f.close()
exit()
def download(filename,user_ip,user_port):
s_down = socket(AF_INET, SOCK_DGRAM)
num = 0
try:
f = open(filename,'rb')
except:
error_data = struct.pack('!HHHb',5,5,5,num)
s_down.sendto(error_data, (user_ip,user_port)) #
exit() #
while True:
read_data = f.read(512)
send_data = struct.pack('!HH',3,num) + read_data
s_down.sendto(send_data, (user_ip,user_port)) #
if len(read_data) < 512:
print(' , ')
exit()
recv_ack = s_down.recv(1024) #
caozuoma,ack_num = struct.unpack("!HH", recv_ack)
# print(caozuoma,ack_num,len(read_data))
num += 1
if int(caozuoma) != 4 or int(ack_num) != num-1 :
exit()
f.close()
s = socket(AF_INET,SOCK_DGRAM)
s.bind(('',69))
def main():
while 1:
recv_data,(user_ip,user_port) = s.recvfrom(1024) # 69
print(recv_data, user_ip, user_port)
if struct.unpack('!b5sb',recv_data[-7:]) == (0, b'octet', 0):
caozuoma = struct.unpack('!H',recv_data[:2])
filename = recv_data[2:-7].decode('gb2312')
if caozuoma[0] == 1:
print(' ',filename)
t = Thread(target = download, args = (filename,user_ip,user_port))
t.start()
elif caozuoma[0] == 2:
print(' ',filename)
t = Thread(target = upload, args = (filename,user_ip,user_port))
t.start()
if __name__ == '__main__':
main()
업로드 데이터 단순 구현:
#!/usr/bin/env python3
#coding=utf-8
import struct
from socket import *
server_ip = '192.168.119.157'
send_data_1 = struct.pack('!H8sb5sb',2,' .jpg'.encode('gb2312'),0,b'octet',0)
s = socket(AF_INET,SOCK_DGRAM)
s.sendto(send_data_1,(server_ip,69)) # 69
f = open(' .jpg','rb')
recv_data = s.recvfrom(1024) #
rand_port = recv_data[1][1]
print()
ack_num = struct.unpack("!HH",recv_data[0][:4])
num = 0
while True:
read_data = f.read(512)
send_data = struct.pack('!HH',3,num) + read_data
s.sendto(send_data,(server_ip,rand_port)) #
recv_data_2,userinfo = s.recvfrom(1024)
print(recv_data_2)
ack_num = struct.unpack('!H',recv_data_2[2:4])
print(len(read_data),num,ack_num[0],rand_port)
if len(read_data) < 512 or ack_num[0] != num :
break
num = num + 1
다운로드 데이터 단순 구현:
#!/usr/bin/env python3
#coding=utf-8
import struct
from socket import *
filename = 'test.jpg'
server_ip = '192.168.1.113'
send_data = struct.pack('!H%dsb5sb'%len(filename),1,filename.encode('gb2312'),0,'octet'.encode('gb2312'),0)
s = socket(AF_INET,SOCK_DGRAM)
s.sendto(send_data,(server_ip,69)) # , 69
f = open(filename,'ab')
while 1:
recv_data = s.recvfrom(1024) #
caozuoma,ack_num = struct.unpack('!HH',recv_data[0][:4]) #
rand_port = recv_data[1][1] #
if int(caozuoma) == 5:
print(' : ...')
break
print(caozuoma,ack_num,rand_port,len(recv_data[0]))
f.write(recv_data[0][4:])
if len(recv_data[0]) < 516:
break
ack_data = struct.pack("!HH",4,ack_num)
s.sendto(ack_data,(server_ip,rand_port)) # ACK
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.