Skip to content

Instantly share code, notes, and snippets.

@kamikat
Created June 18, 2014 02:37
Show Gist options
  • Save kamikat/3735382694d756663690 to your computer and use it in GitHub Desktop.
Save kamikat/3735382694d756663690 to your computer and use it in GitHub Desktop.
Transfer file over LAN with file name broadcasted (Python)
#!/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
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
print 'Transfer finished.'
#!/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
print 'Transfer finished.'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment