-
Notifications
You must be signed in to change notification settings - Fork 0
/
hw3_client.c
132 lines (98 loc) · 2.44 KB
/
hw3_client.c
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 100
#define SEQ_START 1000
#define ERROR 0
#define SUCCESS 1
#define REQUEST 0
#define RESPONSE 1
#define QUIT 2
int cur_seq = SEQ_START;
void error_handling(char *message);
typedef struct {
int seq;
int ack;
int buf_len;
char buf[BUF_SIZE];
} Packet;
int main(int argc, char* argv[])
{
int sock;
struct sockaddr_in serv_addr;
char message[30];
int str_len;
if(argc!=3){
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(1);
}
sock=socket(PF_INET, SOCK_STREAM, 0);
if(sock == -1)
error_handling("socket() error");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
serv_addr.sin_port=htons(atoi(argv[2]));
if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
error_handling("connect() error!");
// connect success
// input file name
printf("Input file name: ");
char name[100];
scanf("%s", name);
printf("[Client] request %s\n\n", name);
Packet pk;
memset(&pk, 0, sizeof(pk));
pk.ack = cur_seq; // first is 1000
strcpy(pk.buf, name);
write(sock, &pk, sizeof(pk));
// make file to copy
int fd = open(name, O_RDWR | O_CREAT, 0644);
while(1)
{
memset(&pk, 0, sizeof(pk));
read(sock, &pk, sizeof(pk)); // read packet
// case1 file is not exist
// seq is -1
if(pk.seq == -1)
{
close(fd);
remove(name);
error_handling("File Not Found");
}
// case2 file transmit is done
else if(pk.buf_len < BUF_SIZE)
{
printf("[Client] Rx SEQ: %d, len: %d bytes\n", pk.seq, pk.buf_len);
write(fd, pk.buf, pk.buf_len);
cur_seq += pk.buf_len;
break;
}
// case3 file transmit is working
else
{
printf("[Client] Rx SEQ: %d, len: %d bytes\n", pk.seq, pk.buf_len);
write(fd, pk.buf, pk.buf_len);
cur_seq += BUF_SIZE;
memset(&pk, 0, sizeof(pk));
pk.ack = cur_seq;
pk.buf_len = BUF_SIZE;
write(sock, &pk, sizeof(pk));
printf("[Client] Tx ACK: %d\n\n", pk.ack);
}
}
printf("%s received (%d Bytes)\n", name, cur_seq - 1000);
close(fd);
close(sock);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}