class Tracker(): """Tracker for torrents""" def __init__(self, ip, port=None, dbName=None): self.ip = ip self.port = port if dbName: self.db = DB(dbName).db else: self.db = None self.socket = None self.groups = {} # start the tracker server def Start(self): # create a tcp thread self.socket = Socket(self.ip, self.port).TCP() self.socket.bind((self.ip, self.port)) # now listen for any incomming connection print "Tracker listening at "+ self.ip + ":"+str(self.port) self.socket.listen(5) while True: clientSocket, (ip, port) = self.socket.accept() print "Responding to ", ip, port clientThread = ClientThread(self, clientSocket, ip, port) clientThread.start()
class Server(): """Server for torrent files""" def __init__(self, ip, port=None, dbName=None): self.socket = None self.ip = ip self.port = port self.db = DB(dbName).db """ Start the server """ def Start(self): # create a tcp socket self.socket = Socket(self.ip, self.port).TCP() self.socket.bind((self.ip, self.port)) # listen for any incomming connections print "Listening at: ", (self.ip, self.port) self.socket.listen(5) while True: clientSocket, (ip, port) = self.socket.accept() print "Responding to : ", ip, port clientThread = ClientThread(self, clientSocket, ip, port) clientThread.start()
def UploadTorrent(self, file_name, serverAddr): # create a tcp s = Socket(self.ip, self.port).TCP() s.bind((self.ip, self.port)) # connect to severAddr print "Connecting to :", serverAddr s.connect(serverAddr) # upload file to server resp = s.recv(256) if resp == "Ok": s.send("Upload") resp = s.recv(256) if resp == "Ok": # convert file to .torrent file print "Creating torrent file." fp = open(file_name, 'rb') fileContent = fp.read(1024) enCodedString = Torrent().encode(fileName=file_name) fp.close() fp = open(file_name+".torrent", "wb") fp.write(enCodedString) fp.close() # send torrent file to server # open the file # send recursively print "Sending file to server.." f = open(file_name+'.torrent', 'rb') l = f.read(1024) while(l): s.send(l) l = f.read(1024) f.close() print "Waiting for resonse from server" resp = s.recv(1024) if resp == "Failed": print "File upload failed." s.close() # self.UploadTorrent(file_name, serverAddr) elif resp == "Ok": # file successfully uploaded. Now open socket to let users download this file print "File successfully uploaded." s.close() self.SendFile( file_name) else: print "Server won't let you upload" else: print "Unable to talk to server. Please try after sometime." s.close()
def SendFile(self, file_name): print "Waiting for any group connection at ", self.ip, self.port, "..." # keep connection open, listen sock = Socket(self.ip, self.port).TCP() sock.bind((self.ip, self.port)) sock.listen(5) # accept connection from tracker while True: groupSocket, (ip, port) = sock.accept() print "Seeding to group ", ip, port groupThread = ClientThread(groupSocket, ip, port, file_name) groupThread.start()
def GetGroup(self, trackerAddr, fileName): ''' Get tracker's ip and port Create a TCP socket and get group after doing some message passing ''' # create a tcp socket s = Socket(self.ip, self.port).TCP() s.bind((self.ip, self.port)) # connect socket to tracker s.connect(trackerAddr) # get group from tracker after doing some message passing resp = s.recv(256) if resp == "Ok": s.send("Leecher") resp = s.recv(256) if resp == "Ok": s.send(fileName) resp = s.recv(256) if resp == "Ok": resp = s.recv(1024) if resp == "Failed": print "Unable to assign a group.." groupAddr = None # we got the group addr groupAddr = resp else: print "File not exists at server" groupAddr = None else: print "Tracker is not respoinding..." groupAddr = None s.close() return groupAddr
def JoinGroup(self, groupIP, groupPort): ''' Create a UDP socket Join the group ''' s = Socket(self.ip, self.port).UDP() # Allow multiple copies of this program on one machine s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Bind it to the port s.bind((groupIP, groupPort)) # get the group to join group_bin = socket.inet_pton(socket.AF_INET, groupIP) # Join group mreq = group_bin + struct.pack('=I', socket.INADDR_ANY) s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) return s