Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
pcom-laboratoare-public
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
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
PCom
pcom-laboratoare-public
Commits
95c6effb
Commit
95c6effb
authored
2 weeks ago
by
Ion-Dorinel FILIP (25005)
Browse files
Options
Downloads
Patches
Plain Diff
[lab6]: Use the same syntax for all the comments
parent
bc5825ad
No related branches found
Branches containing commit
No related tags found
1 merge request
!27
[lab6]: Use the same syntax for all the comments
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
lab6/client.c
+26
-25
26 additions, 25 deletions
lab6/client.c
lab6/include/list.h
+5
-5
5 additions, 5 deletions
lab6/include/list.h
lab6/lib/list.c
+6
-6
6 additions, 6 deletions
lab6/lib/list.c
lab6/server.c
+18
-21
18 additions, 21 deletions
lab6/server.c
with
55 additions
and
57 deletions
lab6/client.c
+
26
−
25
View file @
95c6effb
...
...
@@ -16,7 +16,7 @@
#include
"list.h"
#include
"utils.h"
/
*
Max size of the datagrams that we will be sending
*/
/
/
Max size of the datagrams that we will be sending
#define CHUNKSIZE MAX_SIZE;
#define SENT_FILENAME "file.bin"
#define SERVER_IP "172.16.0.100"
...
...
@@ -51,10 +51,10 @@ void send_file_start_stop(int sockfd, struct sockaddr_in server_address,
d
.
seq
=
seq
;
seq
++
;
/
*
TODO 1.1: Send the datagram.
*/
/
/
TODO 1.1: Send the datagram.
/
*
TODO 1.2: Wait for ACK before moving to the next datagram to send.
If timeout or wrong seq number, resend the datagram.
*/
/
/
TODO 1.2: Wait for ACK before moving to the next datagram to send.
//
If timeout or wrong seq number, resend the datagram.
if
(
n
==
0
)
// end of file
break
;
...
...
@@ -68,13 +68,13 @@ void send_file_go_back_n(int sockfd, struct sockaddr_in server_address,
DIE
(
fd
<
0
,
"open"
);
int
rc
;
/
*
TODO 2.1: Increase window size to a value that optimally uses the link
*/
/
/
TODO 2.1: Increase window size to a value that optimally uses the link
int
window_size
=
5
;
window
->
max_seq
=
5
;
// Read the entire file in chunks and add them into a list of seq_udp (window)
int
seq
=
1
;
while
(
1
)
{
/* Read the entire file in chunks and add them into a list of seq_udp (window) */
struct
seq_udp
*
d
=
malloc
(
sizeof
(
struct
seq_udp
));
DIE
(
d
==
NULL
,
"malloc"
);
...
...
@@ -90,14 +90,14 @@ void send_file_go_back_n(int sockfd, struct sockaddr_in server_address,
break
;
}
/
*
TODO 2.2: Send window_size packets to the server to saturate the link
*/
/
/
TODO 2.2: Send window_size packets to the server to saturate the link
/
*
In a loop, untill the list of packets is empty
*/
/
/
In a loop, untill the list of packets is empty
/
*
TODO 2.2: On ACK remove from the list all the segments that have been ACKed
and send the next new segments added to the window
*/
/
/
TODO 2.2: On ACK remove from the list all the segments that have been ACKed
//
and send the next new segments added to the window
/
*
TODO 2.3: On timeout on recv resend all the segments from the window
*/
/
/
TODO 2.3: On timeout on recv resend all the segments from the window
}
void
send_a_message
(
int
sockfd
,
struct
sockaddr_in
server_address
)
{
...
...
@@ -105,38 +105,38 @@ void send_a_message(int sockfd, struct sockaddr_in server_address) {
strcpy
(
d
.
payload
,
"Hello world!"
);
d
.
len
=
strlen
(
"Hello world!"
);
/
*
Send a UDP datagram. Sendto is implemented in the kernel (network stack of
*
it), it basically creates a UDP datagram, sets the payload to the data we
*
specified in the buffer, and the completes the IP header and UDP header
*
using the sever_address info.
*/
/
/
Send a UDP datagram. Sendto is implemented in the kernel (network stack of
//
it), it basically creates a UDP datagram, sets the payload to the data we
//
specified in the buffer, and the completes the IP header and UDP header
//
using the sever_address info.
int
rc
=
sendto
(
sockfd
,
&
d
,
sizeof
(
struct
seq_udp
),
0
,
(
struct
sockaddr
*
)
&
server_address
,
sizeof
(
server_address
));
DIE
(
rc
<
0
,
"send"
);
/
*
Receive the ACK. recvfrom is blocking with the current parameters
*/
/
/
Receive the ACK. recvfrom is blocking with the current parameters
int
ack
;
rc
=
recvfrom
(
sockfd
,
&
ack
,
sizeof
(
ack
),
0
,
NULL
,
NULL
);
}
int
main
(
void
)
{
/
*
We use this structure to store the server info. IP address and Port.
*
This will be written by the UDP implementation
into the header */
/
/
We use this structure to store the server info. IP address and Port.
//
This will be written by the UDP implementation
on recvfrom().
struct
sockaddr_in
servaddr
;
int
sockfd
,
rc
;
// for benchmarking
TICK
(
TIME_A
);
/
*
Our transmission window
*/
/
/
Our transmission window
window
=
create_list
();
// Creating socket file descriptor. SOCK_DGRAM for UDP
sockfd
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
);
DIE
(
sockfd
<
0
,
"socket"
);
/
*
Set the timeout on the socket
*/
/
/
Set the timeout on the socket
struct
timeval
timeout
;
timeout
.
tv_sec
=
0
;
timeout
.
tv_usec
=
250000
;
// 250ms
...
...
@@ -151,9 +151,10 @@ int main(void) {
servaddr
.
sin_port
=
htons
(
PORT
);
inet_aton
(
SERVER_IP
,
&
servaddr
.
sin_addr
);
/* TODO: Read the demo function.
Implement and test (one at a time) each of the proposed versions for sending a
file. */
// TODO: Read the demo function.
// Implement and test (one at a time) each of the proposed versions for sending a
// file.
send_a_message
(
sockfd
,
servaddr
);
// send_file_start_stop(sockfd, servaddr, SENT_FILENAME);
// send_file_go_back_n(sockfd, servaddr, SENT_FILENAME);
...
...
@@ -162,7 +163,7 @@ int main(void) {
free
(
window
);
/
*
Print the runtime of the program
*/
/
/
Print the runtime of the program
TOCK
(
TIME_A
);
return
0
;
...
...
This diff is collapsed.
Click to expand it.
lab6/include/list.h
+
5
−
5
View file @
95c6effb
#ifndef _LIST_H_
#define _LIST_H_
/
*
List entry
*/
/
/
List entry
struct
cel
{
void
*
info
;
int
info_len
;
...
...
@@ -12,16 +12,16 @@ struct cel {
typedef
struct
cel
list_entry
;
/
*
Window as a list
*/
/
/
Window as a list
typedef
struct
{
int
size
;
int
max_seq
;
list_entry
*
head
;
}
list
;
/
*
Creates a list
*/
/
/
Creates a list
list
*
create_list
();
/
*
Adds a segment to the window
*/
/
/
Adds a segment to the window
void
add_list_elem
(
list
*
window
,
void
*
segment
,
int
segment_size
,
int
seq
);
#endif
/
*
_LIST_H_
*/
#endif /
/
_LIST_H_
This diff is collapsed.
Click to expand it.
lab6/lib/list.c
+
6
−
6
View file @
95c6effb
...
...
@@ -9,7 +9,7 @@ list *create_list() {
return
l
;
}
/
*
append order by seq
*/
/
/
append order by seq
void
add_list_elem
(
list
*
list
,
void
*
info
,
int
info_len
,
int
seq
)
{
/* first check for duplicates seq */
...
...
@@ -21,11 +21,11 @@ void add_list_elem(list *list, void *info, int info_len, int seq) {
l_check
=
l_check
->
next
;
}
/
*
create list entry and set seq and type
*/
/
/
create list entry and set seq and type
list_entry
*
l
=
(
list_entry
*
)
calloc
(
1
,
sizeof
(
list_entry
));
l
->
seq
=
seq
;
/
*
buffer info
*/
/
/
buffer info
if
(
info_len
>
0
)
{
l
->
info
=
calloc
(
info_len
,
sizeof
(
char
));
memcpy
(
l
->
info
,
info
,
info_len
);
...
...
@@ -34,13 +34,13 @@ void add_list_elem(list *list, void *info, int info_len, int seq) {
l
->
info
=
NULL
;
}
/
*
first elem
*/
/
/
first elem
if
(
list
->
head
==
NULL
)
{
list
->
head
=
l
;
}
else
{
list_entry
*
_l
=
list
->
head
;
/
*
first elem
*/
/
/
first elem
if
(
_l
->
seq
>
seq
)
{
l
->
next
=
_l
;
list
->
head
=
l
;
...
...
@@ -48,7 +48,7 @@ void add_list_elem(list *list, void *info, int info_len, int seq) {
return
;
}
/
*
find elem place
*/
/
/
find elem place
while
(
_l
->
next
&&
_l
->
next
->
seq
<
seq
)
{
_l
=
_l
->
next
;
}
...
...
This diff is collapsed.
Click to expand it.
lab6/server.c
+
18
−
21
View file @
95c6effb
...
...
@@ -21,19 +21,18 @@ int recv_seq_udp(int sockfd, struct seq_udp *seq_packet, int expected_seq) {
struct
sockaddr_in
client_addr
;
socklen_t
clen
=
sizeof
(
client_addr
);
/
*
Receive a segment with seq_number seq_packet->seq
*/
/
/
Receive a segment with seq_number seq_packet->seq
int
rc
=
recvfrom
(
sockfd
,
seq_packet
,
sizeof
(
struct
seq_udp
),
0
,
(
struct
sockaddr
*
)
&
client_addr
,
&
clen
);
/
*
TODO: Check if the sequence number is the expected one.
*/
/
/
TODO: Check if the sequence number is the expected one.
/* TODO: If we got the expected packet (by seq) send ACK for the seq.packet
and return the number of bytes read.
We will increase expected_seq in the calling function (recv_a_file(...)) */
// TODO: If we got the expected packet (by seq) send ACK for the seq.packet
// and return the number of bytes read.
// We will increase expected_seq in the calling function (recv_a_file(...))
/
*
TODO: If segment is not with the expected number, send ACK
for the last well received packet (expected_seq - 1) and return -1
*/
/
/
TODO: If segment is not with the expected number, send ACK
//
for the last well received packet (expected_seq - 1) and return -1
}
void
recv_a_file
(
int
sockfd
,
char
*
filename
)
{
...
...
@@ -44,21 +43,19 @@ void recv_a_file(int sockfd, char *filename) {
int
rc
;
while
(
1
)
{
/
*
Receive a chunk
*/
/
/
Receive a chunk
rc
=
recv_seq_udp
(
sockfd
,
&
p
,
expected_seq
);
/* TODO: If rc == -1 => we didn't receive the expected segment. We continue
*/
// TODO: If rc == -1 => we didn't receive the expected segment. We continue (retry to receive the same chunk).
/* TODO: If rc >=0 => we receive the expected segment. We increase
* expected_seq */
// TODO: If rc >=0 => we receive the expected segment. We increase expected_seq
/* An empty payload means the file ended.
Break if file ended */
// An empty payload means the file ended.
if
(
p
.
len
==
0
)
// Break if file ended
break
;
/
*
Write the chunk to the file
*/
/
/
Write the chunk to the file
write
(
fd
,
p
.
payload
,
p
.
len
);
}
...
...
@@ -66,15 +63,15 @@ void recv_a_file(int sockfd, char *filename) {
}
void
recv_a_message
(
int
sockfd
)
{
/
*
Receive a datagram and send an ACK
*/
/
*
The info of the who sent the datagram (PORT and IP)
*/
/
/
Receive a datagram and send an ACK
/
/
The info of the who sent the datagram (PORT and IP)
struct
sockaddr_in
client_addr
;
struct
seq_udp
p
;
socklen_t
clen
=
sizeof
(
client_addr
);
int
rc
=
recvfrom
(
sockfd
,
&
p
,
sizeof
(
struct
seq_udp
),
0
,
(
struct
sockaddr
*
)
&
client_addr
,
&
clen
);
/
*
We know it's a string so we print it
*/
/
/
We know it's a string so we print it
printf
(
"[Server] Received: %s
\n
"
,
p
.
payload
);
int
ack
=
0
;
...
...
@@ -94,7 +91,7 @@ int main(void) {
exit
(
EXIT_FAILURE
);
}
/
*
Make ports reusable, in case we run this really fast two times in a row
*/
/
/
Make ports reusable, in case we run this really fast two times in a row
int
enable
=
1
;
if
(
setsockopt
(
sockfd
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
enable
,
sizeof
(
int
))
<
0
)
perror
(
"setsockopt(SO_REUSEADDR) failed"
);
...
...
@@ -103,7 +100,7 @@ int main(void) {
// datagrams have to be sent to our process.
memset
(
&
servaddr
,
0
,
sizeof
(
servaddr
));
servaddr
.
sin_family
=
AF_INET
;
// IPv4
/
*
0.0.0.0, basically match any IP
*/
/
/
0.0.0.0, basically match any IP
servaddr
.
sin_addr
.
s_addr
=
INADDR_ANY
;
servaddr
.
sin_port
=
htons
(
PORT
);
...
...
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