-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.c
More file actions
141 lines (124 loc) · 4.38 KB
/
Copy pathclient.c
File metadata and controls
141 lines (124 loc) · 4.38 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
/*******************************************************************************
* Name : client.c
* Author : Matt Bernardon
* Pledge : I pledge my honor that I have abided by the Stevens Honor System.
******************************************************************************/
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/types.h>
#include <stdlib.h>
#include <getopt.h>
#include <stdbool.h>
char* IP = "127.0.0.1";
int PORT = 25555;
int recvbytes = 0;
//------------------------------------------------------------------------------------------------------
//PARSE CONNECT
void parse_connect(int argc, char** argv, int* server_fd){
int option = 0;
while((option = getopt(argc, argv, ":i:p:h")) != -1){
switch(option){
case 'i':
IP = optarg;
break;
case 'p':
PORT = atoi(optarg);
break;
case 'h':
printf("Usage: %s [-i IP_address] [-p port_number] [-h]\n\n", argv[0]);
printf(" -i IP_address Default to \"127.0.0.1\";\n");
printf(" -p port_number Default to 25555;\n");
printf(" -h Display this help info.\n");
close(*server_fd);
exit(0);
case ':':
fprintf(stderr, "Error: Option '-%c' requires an argument.\n", optopt);
close(*server_fd);
exit(1);
case '?':
fprintf(stderr, "Error: Unknown option '-%c' received.\n", optopt);
close(*server_fd);
exit(1);
}
}
}
//------------------------------------------------------------------------------------------------------
int main(int argc, char* argv[]){
/* STEP 1:
Create a socket to talk to the server;
*/
int server_fd;
struct sockaddr_in server_addr;
socklen_t addr_size = sizeof(server_addr);
server_fd = socket(AF_INET, SOCK_STREAM, 0);
memset(&server_addr, 0, sizeof(server_addr));
parse_connect(argc, argv, &server_fd);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(IP);
//------------------------------------------------------------------------------------------------------
/* STEP 2:
Try to connect to the server.
*/
int c = connect(server_fd,
(struct sockaddr *) &server_addr,
addr_size);
if(c == -1){
perror("Connect");
close(server_fd);
return 1;
}
//------------------------------------------------------------------------------------------------------
//SEND AND RECEIVE
char buffer[1024];
memset(buffer, 0, 1024);
int cfds[2];
cfds[0] = server_fd;
cfds[1] = STDIN_FILENO;
fd_set myset;
FD_SET(server_fd, &myset);
int maxfd = server_fd;
while(1){
maxfd = server_fd;
FD_SET(cfds[0], &myset);
if (cfds[0] > maxfd) maxfd = cfds[0];
FD_SET(cfds[1], &myset);
if (cfds[1] > maxfd) maxfd = cfds[1];
int s = select(maxfd+1, &myset, NULL, NULL, NULL);
if (s == -1){
perror("Select");
close(server_fd);
return 1;
}
for (int i = 0; i < 2; i++){
if (cfds[i] != -1 && FD_ISSET(cfds[i], &myset)){
if (i == 0){
recvbytes = recv(server_fd, buffer, 1024, 0);
if (recvbytes == 0 || recvbytes == -1) {
close(server_fd);
return 0;
}
else{
buffer[recvbytes] = 0;
printf("%s\n", buffer); fflush(stdout);
}
}
else if (i == 1){
scanf("%s", buffer);
if(send(server_fd, buffer, strlen(buffer), 0) == -1){
perror("Send");
close(server_fd);
return 1;
}
}
}
}
}
close(server_fd);
return 0;
}