Created
June 18, 2014 02:37
-
-
Save kamikat/3735382694d756663690 to your computer and use it in GitHub Desktop.
Transfer file over LAN with file name broadcasted (Python)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/env python | |
#-*- coding:utf-8 -*- | |
#Utility( | |
def rep(bytes): | |
bytes = float(bytes) | |
if bytes >= 1099511627776: | |
terabytes = bytes / 1099511627776 | |
size = '%.2fT' % terabytes | |
elif bytes >= 1073741824: | |
gigabytes = bytes / 1073741824 | |
size = '%.2fG' % gigabytes | |
elif bytes >= 1048576: | |
megabytes = bytes / 1048576 | |
size = '%.2fM' % megabytes | |
elif bytes >= 1024: | |
kilobytes = bytes / 1024 | |
size = '%.2fK' % kilobytes | |
else: | |
size = '%.2fb' % bytes | |
return size | |
def getTerminalSize(): | |
def ioctl_GWINSZ(fd): | |
try: | |
import fcntl, termios, struct, os | |
cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, | |
'1234')) | |
except: | |
return None | |
return cr | |
cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) | |
if not cr: | |
try: | |
fd = os.open(os.ctermid(), os.O_RDONLY) | |
cr = ioctl_GWINSZ(fd) | |
os.close(fd) | |
except: | |
pass | |
if not cr: | |
try: | |
cr = (env['LINES'], env['COLUMNS']) | |
except: | |
cr = (25, 80) | |
return int(cr[1]), int(cr[0]) | |
(width, height) = getTerminalSize() | |
width -= 2 | |
#)Utility | |
#Arguments( | |
import argparse | |
parser = argparse.ArgumentParser( | |
description='Client to receive file on LAN.') | |
args = parser.parse_args() | |
#)Arguments | |
#Imports( | |
import socket | |
import os | |
import datetime | |
import sys | |
import threading | |
import time | |
#GetCh | |
try: | |
# Win32 | |
from msvcrt import getch | |
except ImportError: | |
# UNIX | |
def getch(): | |
import sys, tty, termios | |
fd = sys.stdin.fileno() | |
old = termios.tcgetattr(fd) | |
try: | |
tty.setraw(fd) | |
return sys.stdin.read(1) | |
finally: | |
termios.tcsetattr(fd, termios.TCSADRAIN, old) | |
#)Imports | |
#Main Code | |
connected = threading.Event() | |
connected.set() | |
server = '' | |
port = 0 | |
filename = '' | |
filesize = 0 | |
def broadcast(): | |
global server,port,filename,filesize | |
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
s.bind(('0.0.0.0', 8888)) | |
while connected.is_set(): | |
data, addr = s.recvfrom(1024) | |
server = addr[0] | |
(port, filename, filesize) = eval(data) | |
print >>sys.stderr, '%s\r%s[%s] on %s:%d\r' % \ | |
(' ' * width, filename, rep(filesize), server, port), | |
time.sleep(1) | |
connected.set() | |
return | |
print 'Receiving file info from LAN...' | |
print 'Press Enter everytime an desired file was found...' | |
threading.Thread(target=broadcast).start() | |
try: | |
while getch() != '\r': | |
print >>sys.stderr, 'Press Enter when desired file was found...\r', | |
except: | |
exit(1) | |
finally: | |
connected.clear() | |
connected.wait() | |
print 'File to Recv: %s.[%s]' % (filename, rep(filesize)) | |
print 'Connect %s on port %d' % (server, port) | |
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
s.connect((server, port)) | |
print 'Connected to transfer end point.' | |
total = filesize | |
received = 0 | |
f = open(filename, 'wb') | |
start = datetime.datetime.now() | |
time.sleep(0.5) | |
try: | |
while True: | |
data = s.recv(1024) | |
if data == '': | |
break | |
received += len(data) | |
f.write(data) | |
print >>sys.stderr, '%s\r%s/%s, %d%%, Speed:%s/s\r' % \ | |
(' ' * width, | |
rep(received), rep(total), | |
received * 100 / total if total > 0 else 0, | |
rep( | |
received / (datetime.datetime.now() - start).total_seconds() | |
)), | |
except: | |
pass | |
f.close() | |
s.close() | |
print 'Transfer finished.' | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/env python | |
#-*- coding:utf-8 -*- | |
#Utility( | |
def rep(bytes): | |
bytes = float(bytes) | |
if bytes >= 1099511627776: | |
terabytes = bytes / 1099511627776 | |
size = '%.2fT' % terabytes | |
elif bytes >= 1073741824: | |
gigabytes = bytes / 1073741824 | |
size = '%.2fG' % gigabytes | |
elif bytes >= 1048576: | |
megabytes = bytes / 1048576 | |
size = '%.2fM' % megabytes | |
elif bytes >= 1024: | |
kilobytes = bytes / 1024 | |
size = '%.2fK' % kilobytes | |
else: | |
size = '%.2fb' % bytes | |
return size | |
def getTerminalSize(): | |
def ioctl_GWINSZ(fd): | |
try: | |
import fcntl, termios, struct, os | |
cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, | |
'1234')) | |
except: | |
return None | |
return cr | |
cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) | |
if not cr: | |
try: | |
fd = os.open(os.ctermid(), os.O_RDONLY) | |
cr = ioctl_GWINSZ(fd) | |
os.close(fd) | |
except: | |
pass | |
if not cr: | |
try: | |
cr = (env['LINES'], env['COLUMNS']) | |
except: | |
cr = (25, 80) | |
return int(cr[1]), int(cr[0]) | |
(width, height) = getTerminalSize() | |
width -= 2 | |
#)Utility | |
#Arguments( | |
import argparse | |
parser = argparse.ArgumentParser( | |
description='Server to send file.') | |
parser.add_argument('filename', | |
help='The file to send.') | |
parser.add_argument('-p','--port', | |
default=8888, dest='port', type=int, | |
help='The port to listen for client.') | |
parser.add_argument('-r', '--raw', | |
default=False, dest='raw', action='store_true', | |
help="Raw data stream transfer.") | |
args = parser.parse_args() | |
#)Arguments | |
#Imports( | |
import socket | |
import os | |
import datetime | |
import sys | |
import threading | |
import time | |
#)Imports | |
#Main Code | |
connected = threading.Event() | |
total = os.path.getsize(args.filename) | |
print 'File to send: %s.[%s]' % (args.filename, rep(total)) | |
print 'Bind for * on port %d' % args.port | |
def broadcast(): | |
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
s.bind(('', 0)) | |
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) | |
while not connected.is_set(): | |
s.sendto(repr((args.port, args.filename, total)), ('<broadcast>', 8888)) | |
time.sleep(2) | |
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) | |
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | |
s.bind(('',args.port)) | |
s.listen(1) | |
threading.Thread(target=broadcast).start() | |
try: | |
sck, addr = s.accept() | |
except: | |
exit(1) | |
finally: | |
connected.set() | |
print 'Accept connection from %s on %d.' % addr | |
f = open(args.filename, 'rb') | |
start = datetime.datetime.now() | |
time.sleep(0.5) | |
sent = 0 | |
data = f.read(1024) | |
while data != '': | |
sent += sck.send(data) | |
print >>sys.stderr, '%s\r%s/%s, %d%%, Speed:%s/s\r' % \ | |
(' ' * width, | |
rep(sent), rep(total), sent * 100 / total, | |
rep(sent / (datetime.datetime.now() - start).total_seconds())), | |
data = f.read(1024) | |
f.close() | |
sck.close() | |
s.close() | |
print 'Transfer finished.' | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment