-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbank_client.cpp
More file actions
247 lines (196 loc) · 5.92 KB
/
bank_client.cpp
File metadata and controls
247 lines (196 loc) · 5.92 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
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
using namespace std;
constexpr unsigned int SERVER_PORT = 50544;
constexpr unsigned int MAX_BUFFER = 128;
int sockfd; //接收socket number
typedef enum
{
LOGIN,
SAVE,
WITHDRAW,
BALANCE,
TRANSFER,
EXIT
}service;
typedef struct
{
string name;
string password;
int num = 0;
int balance ;
}info;
void login();
void save();
void withdraw();
void balance();
void transfer();
void handle_signal(int sig);
int main(int argc,char *argv[])
{
// 建socket, 透過TCP與IPv4進行資料傳輸
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
cerr << "socket error" << endl;
return 1;
}
// command line 輸入server ID
struct hostent* server = gethostbyname(argv[1]);
if (server == nullptr)
{
cerr << "No such host name" << endl;
return 2;
}
/* 設定client給socket的資訊 */
struct sockaddr_in client_info; // sockaddr_in = IPv4 結構
bzero(&client_info, sizeof(client_info)); // 把struct涵蓋的bits設為0
client_info.sin_family = AF_INET; //使用IPv4協定
bcopy( (char *)server->h_addr, (char *)& client_info.sin_addr.s_addr , server->h_length); // Server- IP address
client_info.sin_port = htons(SERVER_PORT); //Server-port
/*connect between client and server 的連線 */
if (connect(sockfd, (struct sockaddr *) &client_info, sizeof(client_info)) < 0)
{
cerr << "connect error: the server does not look running" << endl;
return 3;
}
string read_buffer1(MAX_BUFFER, 0);
if (read(sockfd, &read_buffer1[0], MAX_BUFFER-1) < 0)
{
cerr << "read from socket is failed!" <<endl;
return 4;
}
cout << read_buffer1 << endl;
signal(SIGINT,handle_signal);
while(1)
{
string read_buffer(MAX_BUFFER, 0);
string service_buffer (MAX_BUFFER, 0);
service work;
cout << endl <<"========= Welcome to Bank Client ======="<<endl;
cout << "請輸入服務項目-> 登入: LOGIN, 存款: SAVE, 提款: WITHDRAW,"
<< "查餘額: BALANCE,轉帳:TRANSFER,結束交易: EXIT "<<endl;
cout << endl;
// getline(): get a line from stream to string
getline(cin, service_buffer);
write(sockfd,service_buffer.c_str(), strlen(service_buffer.c_str()));
if(service_buffer=="LOGIN") work = LOGIN;
else if(service_buffer=="SAVE") work = SAVE;
else if(service_buffer=="WITHDRAW") work = WITHDRAW;
else if(service_buffer=="BALANCE") work = BALANCE;
else if(service_buffer=="TRANSFER") work = TRANSFER;
else work = EXIT;
switch(work)
{
case 0:
login();
break;
case 1:
save();
break;
case 2:
withdraw();
break;
case 3:
balance();
break;
case 4:
// void transfer();
break;
default:
handle_signal(2);
}
}
// close(sockfd);
return 0;
}
// ===============登入帳戶===============
void login()
{
string read_buffer(MAX_BUFFER, 0);
string write_buffer (MAX_BUFFER, 0);
cout << "Got it! Login! "<<endl;
cout << "Please enter your password:";
getline(cin, write_buffer); // getline(): get a line from stream to string
if (write(sockfd, write_buffer.c_str(), strlen(write_buffer.c_str())) < 0)
{
cerr << "write to socket is failed!" << endl;
}
if (read(sockfd, &read_buffer[0], MAX_BUFFER-1) < 0)
{
cerr << "read from socket is failed!" <<endl;
}
cout << read_buffer << endl;
}
// ===============存款===============
void save()
{
string read_buffer(MAX_BUFFER, 0);
string write_buffer (MAX_BUFFER, 0);
cout << "Got it! Saving! "<<endl;
cout << "How much money? : ";
getline(cin, write_buffer); // getline(): get a line from stream to string
if (write(sockfd, write_buffer.c_str(), strlen(write_buffer.c_str())) < 0)
{
cerr << "write to socket is failed!" << endl;
}
if (read(sockfd, &read_buffer[0], MAX_BUFFER-1) < 0)
{
cerr << "read from socket is failed!" <<endl;
}
cout <<read_buffer << endl;
}
// ==============提款===============
void withdraw()
{
string read_buffer(MAX_BUFFER, 0);
string write_buffer (MAX_BUFFER, 0);
cout << "Got it! Withdraw "<< endl;
cout << "How much money? : ";
getline(cin, write_buffer); // getline(): get a line from stream to string
if (write(sockfd, write_buffer.c_str(), strlen(write_buffer.c_str())) < 0)
{
cerr << "write to socket is failed!" << endl;
}
if (read(sockfd, &read_buffer[0], MAX_BUFFER-1) < 0)
{
cerr << "read from socket is failed!" <<endl;
}
cout <<read_buffer << endl;
}
//==============查詢餘額===============
void balance()
{
string read_buffer (MAX_BUFFER, 0);
string write_buffer (MAX_BUFFER, 0);
cout << "Got it! balance "<< endl;
if (read(sockfd, &read_buffer[0], MAX_BUFFER-1) < 0)
{
cerr << "read from socket is failed!" <<endl;
}
cout << read_buffer << endl;
cout << " Need transaction detail? (Y/N) ";
getline(cin, write_buffer); // getline(): get a line from stream to string
if (write(sockfd, write_buffer.c_str(), strlen(write_buffer.c_str())) < 0)
{
cerr << "write to socket is failed!" << endl;
}
}
//==============結束交易===============
void handle_signal(int sig)
{
string write_buffer = "EXIT";
cout << "結束交易中.......Close Socket" <<endl;
write(sockfd, write_buffer.c_str(), strlen(write_buffer.c_str()));
close(sockfd);
cout << "Done!" << endl;
abort();
}