파일 전송 준비
소켓 통신을 통해 파일 전송을 하기 위해 파이썬 스크립트를 작성했다.
스크립트 내용은 다음과 같다.
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
# 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