Socket 통신을 통한 파일 전송

energy·2022년 7월 30일
0

system

목록 보기
4/4

파일 전송 준비

소켓 통신을 통해 파일 전송을 하기 위해 파이썬 스크립트를 작성했다.
스크립트 내용은 다음과 같다.
IP(192.168.0.108)와 포트(7777)를 설정하고, data.zip 파일을 전송한다.
파일 사이즈는 409600바이트(400KB)씩 반복문을 통해 전송한다.

import socket

SIZE = 409600

with open('data.zip', 'rb') as f:
    data = f.read()
    l = len(data)
    i = 0
    while True:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('192.168.0.108', 7777))
        s.send(data[i:min(i+SIZE, l)])
        print(f"[{min(i+SIZE, l)/l*100:.0f}%] send . . . {min(i+SIZE, l)} / {l} ")
        s.close()
        i += SIZE
        if i > l:
            print("[*!*] Success")
            break
print("[*] File Transfer complete")



파일 수신 준비

파일을 수신하는 서버에서는 Netcat을 이용하여 패킷 수신 준비를 한다.
netcat 옵션 중 listening을 하는 -l 옵션과 socket 통신에 대해 계속 유지하는 -k 옵션을 사용해야
반복문으로 송신하는 파일을 수신할 수 있는데, -k 옵션이 잘 적용되지 않아서 자꾸 세션이 끊긴다.

-l			listen mode, for inbound connects
-k          set keepalive option on socket

그래서 Netcat 수신이 끊어지지 않게 반복문으로 무한루프를 돌리도록 쉘 스크립트를 작성했다.
(물론 파일 수신이 끝나면 무한루프를 kill 하는 스크립트도 따로 작성했다.)
별도로 kill 하기 전까지는 Netcat을 통해 7777 포트로 수신한 값들을 data.zip으로 저장한다.
# recv.sh

while true;
do nc -klvp 7777 >> data.zip;
done



파일 송수신

수신 쉘 스크립트를 실행하여 Listening 한다.

# 수신측 서버

root@energy:~/Desktop# ls
kill_nc.sh  recv.sh
root@energy:~/Desktop# ./recv.sh 
listening on [any] 7777 ...

송신할 파일은 다음과 같다.

송신할 파일을 확인하고 파이썬 스크립트를 실행한다.

# 송신측 서버

λ ls
data.zip  send.py
λ python send.py                   
[5%] send . . . 409600 / 7576481   
[11%] send . . . 819200 / 7576481  
[16%] send . . . 1228800 / 7576481 
. . . (생략) . . .
[97%] send . . . 7372800 / 7576481 
[100%] send . . . 7576481 / 7576481
[*!*] Success                      
[*] File Transfer complete         

수신측 서버에도 파일 수신 로그가 남겨진다.
# 수신측 서버

root@energy:~/Desktop# ./recv.sh 
listening on [any] 7777 ...
192.168.0.105: inverse host lookup failed: Unknown host
connect to [192.168.0.108] from (UNKNOWN) [192.168.0.105] 1654
listening on [any] 7777 ...
192.168.0.105: inverse host lookup failed: Unknown host
. . . (생략) . . .
listening on [any] 7777 ...
192.168.0.105: inverse host lookup failed: Unknown host
connect to [192.168.0.108] from (UNKNOWN) [192.168.0.105] 1672
listening on [any] 7777 ...
root@energy:~/Desktop# ls
data.zip  kill_nc.sh  recv.sh

정상적으로 수신이 완료되었다.

0개의 댓글