-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprotocol.txt
More file actions
64 lines (51 loc) · 3.54 KB
/
protocol.txt
File metadata and controls
64 lines (51 loc) · 3.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
-------
Pacotes
-------
-> login
-> username
-> directoryName
-> files array de com (path, is_directory, last modified)
-> requestFile
-> file (path)
-> sendFile
-> file (path, is_directory, content, last modified)
-> logoutPacket
-> is_reply
---------
Mensagens
---------
-> Header:
1 byte para tipo de pacote.
-> Corpo:
-> Se login packet: (0)
-> 1 byte para especificar o tamanho do nome do utilizador. (maximo de caracteres - 256)
-> 1 byte para especificar o tamanho do nome da diretoria que o utilizador esta a sincronizar. (maximo de caracteres - 256)
-> 4 bytes para especificar quantos ficheiros estao no cliente. (maximo de ficheiros - 4294967296)
-> Nome do utilizador
-> Nome da diretoria
-> Lista de com o seguinte formato:
-> 1 byte para especificar o tamanho do path relativo do ficheiro (maximo de caracteres - 256)
-> 1 byte para especificar se é directory ou file
-> 4 bytes para Timestamp da ultima data de modificacao
-> Path relativo do ficheiro
-> Se requestFile packet: (1)
-> 1 byte para especificar o tamanho do path relativo do ficheiro (maximo de caracteres - 256)
-> Path relativo do ficheiro
-> Se sendFile packet: (2)
-> 1 byte para especificar o tamanho do path relativo do ficheiro (maximo de caracteres - 256)
-> 1 byte para especificar se é directory ou file
-> 4 bytes para Timestamp da ultima data de modificacao
Se for file:
-> 4 bytes para especificar o tamanho do conteudo do ficheiro (maximo de tamanho - 4GB)
-> Path relativo do ficheiro
-> Conteudo do ficheiro
-> Se logout packet: (3)
-> 1 byte para especificar o boolean is_reply
-------------
Funcionamento
-------------
1. Cliente liga ao servidor, enviando um Login packet, onde especifica o seu username e todos os ficheiros e folders que tem, bem como os seus timestamps.
2. Servidor compara os ficheiros do cliente com os que tem. Para todos os ficheiros que ou o server não tiver ou o cliente tiver mais recente, envia um RequestFile packet; para todos os ficheiros que o cliente não tiver ou o servidor tiver mais recente, envia um SendFile packet. Depois de todos esses packets, envia um Logout packet para indicar que pretende terminar a ligação pois já enviou tudo o que tinha a enviar.
3. Cliente recebe os RequestFile packets e envia SendFile packets contendo o ficheiro e metadata, e recebe SendFile packets contendo os ficheiros que não tinha actualizados. Por fim irá receber o Logout packet a indicar que o Servidor pretende terminar a ligação, ao qual responde com um Logout packet a confirmar que a ligação pode ser fechada.
4. Servidor recebe todos os SendFile packet, que foram respostas aos seus RequestFile, e por fim o Logout packet, terminando a ligação correspondente a esse cliente.
É de notar que o Logout packet do Servidor é enviado somente após este ter enviado ou pedido todos os ficheiros necessários (não precisa de ter já recebido), e que o Cliente irá receber esse packet apenas depois de ter recebido ou enviado todos os ficheiros necessários (que já terá obrigatoriamente recebido devido à ordem pela qual são enviados pelo Servidor). O Servidor não fecha logo a ligação pois necessita que o Cliente primeiro responda com todos os ficheiros necessários. Assim, a ligação apenas é fechada após ambos os lados terem confirmação que o outro lado também a quer fechar, por ter enviado um Logout packet. Visto que a ordem das mensagens é garantida por TCP, a ligação permanece aberta até ambos os lados sinalizarem que não têm mais nada a enviar.