# -*- coding: utf-8 -*-
__author__ = 'Rafael S. Guimarães e João Paulo de Brito Gonçalves'

import socket
import struct

class ClientP2P(object):
    def __init__(self, host):
        self.host = host
        self.port = 12345
        self.sock = None

    def ip2int(self, addr):
        return struct.unpack("!I", socket.inet_aton(addr))[0]

    def int2ip(self, addr):
        return socket.inet_ntoa(struct.pack("!I", addr))

    def sendJoinMsg(self, msg):
        # Envio Update
        if(msg['type'] == 0 ):
            sendMsg = struct.pack("!BI",int(msg('type')),int(msg['id_node']))
        elif(msg['type'] == 64):
            #Resposta Join
            sendMsg = struct.pack("!BIIII",int(msg('type')),int(msg['id_node_sucessor']),
                                  self.ip2int(msg['ip_node_sucessor']),int(msg['id_node_predecessor']),
                                  self.ip2int(msg['ip_node_predecessor']))

        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.connect((msg['dest_ip_addr'], self.port))
        res = self.sock.send(sendMsg)
        self.sock.close()

    def sendLeaveMsg(self, msg):
        # Envio Leave
        if(msg['type'] == 1):
            sendMsg = struct.pack("!BIIIII",int(msg('type')),int(msg['id_node_out']),
                                  int(msg['id_node_sucessor']),self.ip2int(msg['ip_node_sucessor']),
                                  int(msg['id_node_predecessor'],self.ip2int(msg['ip_node_predecessor'])))
        elif(msg['type'] == 65):
            #Resposta Leave
            sendMsg = struct.pack("!BI",int(msg('type')),int(msg['id_src_msg']))

        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.connect((msg['dest_ip_addr'], self.port))
        res = self.sock.send(sendMsg)
        self.sock.close()

    def sendLookupMsg(self, msg):
        # Envio Lookup
        if(msg['type'] == 2):
            sendMsg = struct.pack("!BIII",int(msg('type')),int(msg['src_id_searched']),
                                  self.ip2int(msg['src_ip_searched']),int(msg['id_searched']))
        elif(msg['type'] == 66):
            #Resposta Lookup
            sendMsg = struct.pack("!BIII",int(msg('type')),int(msg['id_searched']),
                                  int(msg['id_sucessor_searched']),self.ip2int(msg['ip_sucessor_searched']))


        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.connect((msg['dest_ip_addr'], self.port))
        res = self.sock.send(sendMsg)
        self.sock.close()

    def sendUpdateMsg(self, msg):
        # Envio Join
        if(msg['type'] == 3):
            #Resposta Join
            sendMsg = struct.pack("!BIII",int(msg('type')),int(msg['id_src']),
                                  int(msg['id_new_sucessor']),self.ip2int(msg['ip_new_sucessor']))
        elif(msg['type'] == 67):
            sendMsg = struct.pack("!BI",int(msg('type')),int(msg['id_src_msg']))

        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.connect((msg['dest_ip_addr'], self.port))
        res = self.sock.send(sendMsg)
        self.sock.close()

    def sendMessage(self, msg):
        """
            Send Message using UDP Protocol
        """
        # Socket Object
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.connect((self.host, self.port))
        res = self.sock.send(msg)
        self.sock.close()
@@ -473,16 +473,79 @@
 Envi
-o Update
+a da mensagem de Update com c%C3%B3digo 0 e Identificador do novo n%C3%B3 do anel
 %0A   
@@ -688,32 +688,33 @@
 ):%0A            #
+ 
 Resposta Join%0A  
@@ -698,36 +698,210 @@
      # Resposta 
-Join
+da mensagem Join com o c%C3%B3digo 64 e com os campos Identificador do Sucessor, Endere%C3%A7o IP do Sucessor,%0A            # Identificador do n%C3%B3 predecessor e Endere%C3%A7o IP do n%C3%B3 predecessor
 %0A            sen
@@ -1398,21 +1398,194 @@
 # Envio 
-Leave
+da mensagem Leave com o c%C3%B3digo 1 e os campos ID do n%C3%B3 saindo da rede, ID do n%C3%B3 Sucessor, ID do n%C3%B3%0A        # antecessor, Endere%C3%A7o IP do n%C3%B3 sucessor e endere%C3%A7o IP do n%C3%B3 antecessor.
 %0A       
@@ -1956,21 +1956,85 @@
 esposta 
-Leave
+ da mensagem Leave com o c%C3%B3digo 65 e o campo ID da Origem da Mensagem
 %0A       
@@ -2352,22 +2352,81 @@
 # Envio 
-Lookup
+da mensagem  de Lookup com o c%C3%B3digo 2 e os campos correspondentes
 %0A       
@@ -2664,24 +2664,16 @@
 == 66):%0A
-        
     #Res
@@ -2678,22 +2678,78 @@
 esposta 
-Lookup
+da mensagem Lookup com o c%C3%B3digo 66 e os campos correspondentes
 %0A       
@@ -3184,69 +3184,227 @@
 vio 
-Join%0A        if(msg%5B'type'%5D == 3):%0A            #Resposta Join
+da mensagem Update  com c%C3%B3digo 3 e ID da Origem da Procura%0A        if(msg%5B'type'%5D == 3):%0A            #Resposta da mensagem Update com c%C3%B3digo 67 e campos ID do novo sucessor, IP do novo sucessor e Identificador da origem
 %0A   
@@ -4169,28 +4169,29 @@
 g)%0A        self.sock.close()
+%0A

Update ClientP2P.py