Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
redes1-trabalho1
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Eduardo Machado
redes1-trabalho1
Commits
f730fc90
Commit
f730fc90
authored
9 years ago
by
Victor Perszel
Browse files
Options
Downloads
Patches
Plain Diff
funcao de recebimento de dados
parent
342a9bfe
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
include/messages.h
+9
-2
9 additions, 2 deletions
include/messages.h
src/messages.cpp
+104
-7
104 additions, 7 deletions
src/messages.cpp
with
113 additions
and
9 deletions
include/messages.h
+
9
−
2
View file @
f730fc90
...
...
@@ -13,10 +13,17 @@ class Message{
SubMessage
messages
[
3
];
// Janela deslizante permite 3 mensagens de uma vez
public:
// Métodos que fazem as requisições dos comandos
int
sendCD
(
unsigned
char
*
);
int
sendLS
(
unsigned
char
*
);
int
sendPUT
(
unsigned
char
*
);
int
sendGET
(
unsigned
char
*
);
int
sendData
(
unsigned
char
*
);
// Método que divide e envia uma mensagem.
// int receiveMessage(); // Método que recebe as mensagens e as agrupa
// Métodos que faz o recebimento e resposta aos comandos
int
receiveCD
(
unsigned
char
*
);
// Lida com mensagens tipo CD
int
receiveLS
(
unsigned
char
*
);
// Lida com mensagens tipo LS
int
receivePUT
(
unsigned
char
*
);
// Lida com... ok você entendeu
int
receiveGET
(
unsigned
char
*
);
int
receiveData
(
unsigned
char
*
,
int
);
// Método que recebe as mensagens e as agrupa
};
This diff is collapsed.
Click to expand it.
src/messages.cpp
+
104
−
7
View file @
f730fc90
...
...
@@ -307,7 +307,11 @@ int Message::sendGET(unsigned char* fileName){
}
else
{
ok
.
setData
((
unsigned
char
*
)
answer
.
getSeq
(),
8
,
0
);
// Manda um ok
send
(
soquete
,
ok
.
objToString
(),
ok
.
getSize
()
+
4
,
0
);
funcaoRecebeDados
();
if
(
receiveData
(
fileName
,
atoi
(
answer
.
getData
()))
==
-
1
){
cout
<<
"Erro no recebimento de dados (messages.cpp::sendGET)"
<<
endl
;
return
-
1
;
}
else
{
cout
<<
"Arquivo transferido com sucesso"
<<
endl
;
return
0
;
}
}
...
...
@@ -317,6 +321,7 @@ int Message::sendGET(unsigned char* fileName){
}
}
}
}
int
Message
::
sendData
(
unsigned
char
*
stringMessage
){
int
numberOfMessages
,
sizeLastMessage
,
size
=
0
;
...
...
@@ -414,19 +419,19 @@ int Message::sendData(unsigned char* stringMessage){
// Lê começo da mensagem e vê se tem o delimitador de início
if
(
answer
.
getStartMessage
()
==
0x7E
){
// 0x7E = 01111110
if
(
numberOfMessages
==
1
){
if
(
answer
.
get
Data
()[
0
]
==
'1'
){
if
(
answer
.
get
Type
()
==
1
){
//ACK
success
=
1
;
// YAY
}
else
{
cout
<<
"Mensagem entregue com erro (messages.cpp::sendData)"
<<
endl
;
}
}
else
if
(
numberOfMessages
==
2
){
// numero de mensagens = 2
if
(
answer
.
getData
()
==
(
unsigned
char
*
)
"1 1"
){
// aceitou ambas as msgs
if
((
answer
.
getType
()
==
1
)
&&
(
answer
.
getData
()
==
(
unsigned
char
*
)
'1'
)
){
// aceitou ambas as msgs
success
=
1
;
// YAY
}
else
{
cout
<<
"Mensagem entregue com erro (messages.cpp::sendData)"
<<
endl
;
}
}
else
{
// numbero de mensagens = 3
if
(
answer
.
getData
()
==
(
unsigned
char
*
)
"1 2"
){
// aceitou ambas as msgs
if
((
answer
.
getType
()
==
1
)
&&
(
answer
.
getData
()
==
(
unsigned
char
*
)
'2'
)
){
// aceitou ambas as msgs
success
=
1
;
// YAY
}
else
{
cout
<<
"Mensagem entregue com erro (messages.cpp::sendData)"
<<
endl
;
...
...
@@ -444,7 +449,9 @@ int Message::sendData(unsigned char* stringMessage){
i
=
0
;
while
(
i
<
numberOfMessages
-
2
){
error
=
send
(
soquete
,
subMensagem
[
i
].
objToString
()
,
subMensagem
[
i
].
getSize
()
+
4
,
0
);
if
(
i
<
numberOfMessages
-
1
)
error
=
send
(
soquete
,
subMensagem
[
i
+
1
].
objToString
()
,
subMensagem
[
i
].
getSize
()
+
4
,
0
);
if
(
i
<
numberOfMessages
)
error
=
send
(
soquete
,
subMensagem
[
i
+
2
].
objToString
()
,
subMensagem
[
i
].
getSize
()
+
4
,
0
);
success
=
0
;
...
...
@@ -475,6 +482,8 @@ int Message::sendData(unsigned char* stringMessage){
}
else
{
success
=
0
;
}
}
else
if
(
answer
.
getType
()
==
0
){
success
=
0
;
// NACK
}
}
}
...
...
@@ -488,3 +497,91 @@ int Message::sendData(unsigned char* stringMessage){
}
return
0
;
}
//################# MÉTODOS DA CLASSE Message --> Recebimento #################
int
receiveData
(
unsigned
char
*
fileName
,
int
size
){
int
numberOfMessages
,
messagesCounter
=
0
,
seqCounter
;
int
i
,
garbage
,
error
,
rv
,
success
=
0
,
greaterSeq
=
0
;
unsigned
char
*
subData
;
char
*
receiptMessage
=
(
char
*
)
malloc
(
sizeof
(
char
*
)
*
64
);
struct
pollfd
ufds
[
1
];
SubMessage
nack
,
ack
,
answer
;
ofstream
fileOut
;
map
<
int
,
string
>
subMensagem
;
string
finalMessage
;
ufds
[
0
].
fd
=
soquete
;
ufds
[
0
].
events
=
POLLIN
;
// Verifica quantas mensagens serao necessarias
if
(
size
%
64
){
numberOfMessages
=
(
size
/
64
)
+
1
;
}
else
{
numberOfMessages
=
(
size
/
64
);
}
numberOfMessages
++
;
// +1 = Mensagem de FIM
while
(
!
success
){
rv
=
poll
(
ufds
,
1
,
500
);
if
(
rv
){
if
(
rv
==
-
1
){
cout
<<
"Erro no recebimento dos dados (messages.cpp::receiveData)"
<<
endl
;
return
-
1
;
}
else
{
recv
(
soquete
,
receiptMessage
,
68
*
sizeof
(
char
),
0
);
answer
.
stringToObj
((
unsigned
char
*
)
receiptMessage
);
// Lê começo da mensagem e vê se tem o delimitador de início
if
(
answer
.
getStartMessage
()
==
0x7E
){
// 0x7E = 01111110
if
(
answer
.
checkParity
()){
if
(
messagesCounter
==
0
){
// Se a primeira mensagem tiver erro
nack
.
setData
((
unsigned
char
*
)
answer
.
getSeq
(),
0
,
0
);
// Manda um nack
send
(
soquete
,
nack
.
objToString
(),
nack
.
getSize
()
+
4
,
0
);
}
else
{
ack
.
setData
((
unsigned
char
*
)((
answer
.
getSeq
()
-
1
)
%
64
),
1
,
0
);
send
(
soquete
,
ack
.
objToString
(),
ack
.
getSize
()
+
4
,
0
);
// Manda um ACK
messagesCounter
=
0
;
}
}
else
{
if
(
answer
.
getType
()
==
13
){
if
(
subMensagem
[
answer
.
getSeq
()
+
(
seqCounter
*
64
)]
==
""
){
if
(
answer
.
getSeq
()
==
63
){
seqCounter
++
;
}
subMensagem
[
answer
.
getSeq
()
+
(
seqCounter
*
64
)]
=
(
char
*
)
answer
.
getData
();
messagesCounter
++
;
if
(
answer
.
getSeq
()
+
(
seqCounter
*
64
)
>
greaterSeq
){
greaterSeq
=
answer
.
getSeq
()
+
(
seqCounter
*
64
);
}
if
(
messagesCounter
>
2
){
ack
.
setData
((
unsigned
char
*
)(
greaterSeq
%
64
),
1
,
0
);
send
(
soquete
,
ack
.
objToString
(),
ack
.
getSize
()
+
4
,
0
);
// Manda um ACK
messagesCounter
=
0
;
}
}
else
{
ack
.
setData
((
unsigned
char
*
)
answer
.
getSeq
(),
1
,
0
);
send
(
soquete
,
ack
.
objToString
(),
ack
.
getSize
()
+
4
,
0
);
// Manda um ACK
messagesCounter
=
0
;
}
}
else
if
(
answer
.
getType
()
==
15
){
success
=
1
;
ack
.
setData
((
unsigned
char
*
)((
greaterSeq
%
64
)
+
1
),
1
,
0
);
send
(
soquete
,
ack
.
objToString
(),
ack
.
getSize
()
+
4
,
0
);
// Manda um ACK
}
}
}
}
}
else
{
cout
<<
"Tempo limite de resposta excedido :c
\n
"
<<
endl
;
cout
<<
"TIMEOUT ATINGIDO (messages.cpp::receiveData)"
<<
endl
;
}
}
for
(
i
=
0
;
i
<
greaterSeq
;
++
i
){
finalMessage
+=
subMensagem
[
i
];
}
// Escrita no arquivo de saída.
fileOut
.
open
(
fileName
,
ios
::
out
);
fileOut
<<
finalMessage
;
return
0
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment