python 간단 한 tftp 구현(udp 프로 토 콜 기반)

5244 단어 pythontftpudp
본 논문 의 사례 는 python 이 간단 한 tftp 를 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.

tftp 는 udp 기반 프로 토 콜 입 니 다
  • 간단 한 tftp 를 실현 하려 면 먼저 tftp 의 협의 도가 있어 야 합 니 다
  • 4.567917.tftp 기본 수신 포트 는 69 이지 만 연결 이 있 을 때마다 tftp 는 무 작위 로 하나의 포트 를 배정 하여 이 연결 을 위해 서 비 스 를 제공 합 니 다
  • 조작 코드:1.업로드 2.다운로드 3.전송 데이터 4.수신 확인 5.오류 코드
  • tftp 서버 단순 구현:
    
    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   
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기