Skip to content

Commit b1736d5

Browse files
committed
Send shutdown message on closing connection
1 parent 15cab41 commit b1736d5

File tree

7 files changed

+36
-9
lines changed

7 files changed

+36
-9
lines changed

include/core.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ conn_t connection;
1919
void handshake_init ();
2020
void handshake_terminate ();
2121

22+
void connection_close ();
23+
2224
#endif /* end of include guard: CORE_H_7KCLGLUV */

progs/client.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,14 @@ int main(int argc, char *argv[])
6060

6161
size = 0;
6262
size = getline(&line, &size, stdin);
63+
if (size == 1) break;
6364
*(line + size - 1) = '\0';
6465
udt_send(sock, line, size, 0);
6566
free(line);
6667
}
6768

69+
printf("Disconnected\n");
70+
6871
/* close the connection */
6972
udt_close(sock);
7073
return 0;

progs/server.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ int main(int argc, char *argv[])
8080
printf("Res: %s\n", msg);
8181
}
8282

83+
printf("\nClient disconnected\n");
84+
8385
/* close connection */
8486
if (udt_close(sock) == -1) {
8587
fprintf(stderr, "Could not close socket\n");

src/api.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
#include <sys/types.h>
21
#include <sys/socket.h>
3-
#include <arpa/inet.h>
4-
#include <errno.h>
52
#include <unistd.h>
6-
#include <string.h>
73

84
#include "udt.h"
95
#include "core.h"
@@ -38,7 +34,7 @@ int udt_bind (socket_t sock, sockaddr_t *addr, int len)
3834
if (result == -1) return result;
3935

4036
connection.sock = sock;
41-
connection.is_open = 0;
37+
connection.is_open = 1;
4238
connection.addrlen = len;
4339
connection.is_connected = 0;
4440
connection.is_client = 0;
@@ -87,6 +83,9 @@ int udt_recv(socket_t sock, char *buffer, int len, int flags)
8783
int num_read;
8884

8985
do {
86+
if (connection.is_open == 0 && connection.is_connected == 0)
87+
return 0;
88+
9089
num_read = recv_buffer_read(buffer, len);
9190
} while (num_read == 0);
9291

@@ -101,5 +100,7 @@ int udt_send(socket_t sock, char *buffer, int len, int flags)
101100

102101
int udt_close(socket_t sock)
103102
{
103+
connection_close();
104+
while (connection.is_open);
104105
return close(sock);
105106
}

src/core.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,15 @@ void handshake_terminate()
1616
{
1717
connection.is_connected = 1;
1818
}
19+
20+
void connection_close()
21+
{
22+
packet_t packet;
23+
24+
packet_clear_header (packet);
25+
packet_set_ctrl (packet);
26+
packet_set_type (packet, PACKET_TYPE_SHUTDOWN);
27+
28+
packet_new(&packet, NULL, 0);
29+
send_packet_buffer_write(&packet);
30+
}

src/packet.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#include <arpa/inet.h>
22
#include <stdlib.h>
33
#include <string.h>
4-
#include <stdio.h>
54

65
#include "config.h"
76
#include "packet.h"
87
#include "buffer.h"
98
#include "core.h"
109

10+
extern conn_t connection;
1111

1212
void packet_deserialize(packet_t *packet)
1313
{
@@ -98,6 +98,8 @@ void packet_parse(packet_t packet)
9898
break;
9999

100100
case PACKET_TYPE_SHUTDOWN: /* shutdown */
101+
connection.is_open = 0;
102+
connection.is_connected = 0;
101103
break;
102104

103105
case PACKET_TYPE_ACK2: /* ack of ack */
@@ -110,9 +112,7 @@ void packet_parse(packet_t packet)
110112
break;
111113

112114
default: /* unsupported packet type */
113-
printf("Unknown type: %x\n", packet_get_type(packet));
114-
char msg[] = "Unknown packet";
115-
recv_buffer_write(msg, sizeof(msg));
115+
recv_buffer_write("Unknown message", 16);
116116

117117
}
118118
} else { /* data packet */

src/sender.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
#include <string.h>
22
#include <stdlib.h>
33
#include <sys/socket.h>
4+
#include <stdio.h>
45

56
#include "core.h"
67
#include "sender.h"
78
#include "buffer.h"
9+
#include "packet.h"
810

911
void sender_start (void *arg)
1012
{
@@ -16,6 +18,11 @@ void sender_start (void *arg)
1618
if (sendto(conn -> sock, &packet, sizeof(packet_t), 0,
1719
&(conn -> addr), sizeof(sockaddr_t)) <= 0)
1820
exit(errno);
21+
22+
/* shutdown message */
23+
if (packet.header._head0 == 1408)
24+
conn -> is_open = 0;
25+
1926
memset(&packet, 0, sizeof(packet_t));
2027
}
2128
}

0 commit comments

Comments
 (0)