-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclientA.cpp
More file actions
155 lines (126 loc) · 3.87 KB
/
clientA.cpp
File metadata and controls
155 lines (126 loc) · 3.87 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
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <cerrno>
#include <cstring>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
// UDP
#include "udplisten.cpp"
#include "udpsend.cpp"
//TCP
#include "tcpclient.cpp"
#include "tcpserver.cpp"
#define HOST_ADDR "127.0.0.1"
#define SERVERM_PORT "25944"
#define MAXDATASIZE 4096 // max number of bytes we can get at once
// get sockaddr, IPv4 or IPv6:
// void *get_in_addr(struct sockaddr *sa)
// {
// if (sa->sa_family == AF_INET) {
// return &(((struct sockaddr_in*)sa)->sin_addr);
// }
// return &(((struct sockaddr_in6*)sa)->sin6_addr);
// }
string string_concat(int argc, char *argv[]){
// int string_len = 0
// for(int i = 0; i < argc; i++){
// string_len += strlen(argv[i])
// }
// string_len += argc + 3
// cout << "string_len: " << string_len << endl;
// char str[HUGE];
// strcpy(str, argv[1]);
// for (int i = 2; i < argc; ++i)
// {
// strcat(str, " ");
// strcat(str, argv[i]);
// }
string msg_str = "";
for(int i = 0; i < argc-1; i++){
msg_str = msg_str + argv[i] + " "; // add a space
}
msg_str = msg_str + argv[argc-1];
return msg_str;
}
// reference: Beej's Book, on TCP.
int main(int argc, char *argv[])
{
int sockfd, numbytes;
char buf[MAXDATASIZE];
struct addrinfo hints, *servinfo, *p;
int rv;
char s[INET6_ADDRSTRLEN];
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if ((rv = getaddrinfo(HOST_ADDR, SERVERM_PORT, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}
// loop through all the results and connect to the first we can
for(p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype,
p->ai_protocol)) == -1) {
perror("client: socket");
continue;
}
if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
close(sockfd);
perror("client: connect");
continue;
}
break;
}
if (p == NULL) {
fprintf(stderr, "client: failed to connect\n");
return 2;
}
inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr),
s, sizeof s);
// printf("client: connecting to %s\n", s);
cout << "The client A is up and running." << endl;
freeaddrinfo(servinfo); // all done with this structure
// add by me !!!!!!!!!
string msg_str = string_concat(argc, argv);
if ((numbytes = send(sockfd, msg_str.c_str(), msg_str.length(), 0)) == -1) {
perror("send");
exit(1);
}
if (argc == 4){
cout << argv[1] << " has requested to transfer " << argv[3] << " coins to " << argv[2] << "." << endl;
}
else if (argc == 2){
string param_1(argv[1]);
if (param_1 == "TXLIST"){
cout <<"ClientA sent a sorted list request to the main server." << endl;
}
else{
cout << param_1 << " sent a balance enquiry request to the main server." << endl;
}
}
else if (argc == 3){
cout << argv[1] << "sent a statistics enquiry request to the mains server." << endl;
cout << argv[1] << " statistics are the following:" << endl;
cout << "Rank--Username--NumofTransactions--Total" << endl;
}
// end!!!!!
if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
perror("recv");
exit(1);
}
buf[numbytes] = '\0';
// printf("client: received '%s'\n",buf);
cout << buf << endl; // buf is the message sent back from the main server.
close(sockfd);
return 0;
}