Skip to content

Instantly share code, notes, and snippets.

@pepgonzalez
Created February 12, 2013 04:45
Show Gist options
  • Save pepgonzalez/4760300 to your computer and use it in GitHub Desktop.
Save pepgonzalez/4760300 to your computer and use it in GitHub Desktop.
import socket as s
from sys import argv
IP = "127.0.0.1" #HOST
PUERTO = 5005 #puerto
def armarPaquete(m, cp): #funcion para armar paquetes
paquetes = [] # lista
b = getbytes(m) # llama a funcion getbytes, lista con bits que representan a cada caracter
tramamensaje = armarTrama(b) # llama a armarTrama, arma trama del mensaje en base a lista de bytes
bytes = fragmenta(tramamensaje,cp) # llama a fragmenta, regresa el trama en lista
while(len(bytes) > 0): #loop
p = ''
if (len(bytes) >= cp): # mientras haya elemento en lista
for i in range(cp):
p += bytes.pop(0) # agrupar bytes del tam que capturo el usuario
else:
for i in range(len(bytes)): # si no alcanza, el ultimo paquete se arma con los bits que falten
p += bytes.pop(0)
paquetes.append(p) #se agrega paquetito a lista
cabecera = armarCabecera(len(paquetes),cp) #se arma el paquete inicial de la transmicion
paquetes.insert(0,cabecera) #agrega el paquete inicial al inicio de la lista
lf = [] # lista final
for i in range(len(paquetes)): #iterar en base a lista de paquetes
p = paquetes[i] # obtener paquete de lista
if (len(p) != 16): # si no es un paquete inicial
pf = ''
pf += ObtenerNumeroPaquete(i) #obtener el numero del paquete y asignar
pf += p # cargar resto del msj
lf.append(pf) # agregar a lista
else:
lf.append(p) # si es paquete inicial, lo agrega tal cual
for e in lf: # por cada paquete en lista
enviarPaquete(e) #envia por socket el paquete
def ObtenerNumeroPaquete(n): #funcion para obtener # de paquete
p = bin(n)[2:] #valor binario de n
n = ''
if (len(p) < 8): # rutina para autocompletar un numero de 8 bits
dif = 8 - len(p)
for i in range(dif):
n += '0'
n += p
return n #regresa numero binario
def armarCabecera(cantidadPaquetes, tamPaquete): #armar paquete inicial, con cantidad de paquetes y el tam de c/u
trama = ''
b1 = bin(cantidadPaquetes)[2:] #obtiene valores binarios
b2 = bin(tamPaquete)[2:]
if (len(b1) < 8): #rutina para autocompletar numero de 8 bits
dif = 8 - len(b1)
for i in range(dif):
trama += '0'
trama += b1
if (len(b2) < 8): #rutina para autocompletar numero de 8 bits
dif = 8 - len(b2)
for i in range(dif):
trama += '0'
trama += b2 #arma trama
return trama #regresa trama
def fragmenta(trama, cp): #funcion que regresa una lista con los caracteres del trama
c = []
for e in trama:
c.append(e)
return c
def getbytes(mensaje): #funcion para obtener los bytes
bytes = [] # lista
m = map(ord,mensaje) #lista de caracteres
for e in m: #loop
bf = ''
byte = bin(e)[2:] #valor binario de elemento
if(len(byte) < 8): #rutina para autocompletar # 8 bytes
dif = 8 - len(byte)
for i in range(dif):
bf += '0'
bf += byte
bytes.append(bf) #agrega a lista
return bytes #regresa lista
def armarTrama(bytes): #arma la trama, regresa un string en base a lista de caracteres
trama = ''
for e in bytes:
trama += str(e)
return trama
def enviarPaquete(paquete): #enviar paquetes, levanta el socket y envia el paquete
socket = s.socket(s.AF_INET, s.SOCK_DGRAM)
socket.sendto(paquete,(IP,PUERTO))
def leerArchivo(n): # leer archivo a enviar,
f = open(n,"r")
texto = ''
while True: # loop leer lineas
linea = f.readline()
if not linea: break
texto += linea
return texto # regresa lista
def main():
msj = '' # mensaje a enviar
nombreArchivo = argv[1] #nombre archivo
msj = leerArchivo(nombreArchivo) #llama a funcion leer archivo, para leer el archivo
cantPaquetes = int(argv[2]) #cantidad de bytes por paquete
armarPaquete(msj, cantPaquetes) #Llama a funcion para armar Paquetes
main() #Main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment