-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.c
355 lines (306 loc) · 9.57 KB
/
server.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
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
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
/*
* Author Name: Adam Byczkowski
* Email: [email protected]
* Date: 03/14/2021
* Program Description: This program implements the server role of the mini group project
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "server.h"
#define PORT 8080
struct employee {
int id;
char name[100];
char job_tital[100];
float pay;
float overtime_pay;
float benefit;
char status[2];
int satisfaction_level;
int num_project;
int average_hours_monthly;
int time_at_company_years;
bool work_accident;
bool promotion_five_years;
};
struct salary_sheet {
char id[100];
char job_title[100];
char pay[100];
char overtime_pay[100];
char benefit[100];
char status[100];
};
struct satisfaction_sheet {
char id[100];
char satisfaction_level[100];
char number_project[100];
char monthly_hours[100];
char years_at_company[100];
char work_accident[100];
char promotion_give_years[100];
};
struct salary_input {
char id[100];
struct salary_sheet *s;
};
struct satisfaction_input {
char id[100];
struct satisfaction_sheet *s;
};
/* Function Declaration */
char* get_id(char* emp_name, char *job_title, char* status);
char* get_id_from_line(char* file_line);
int ensure_correct_line(char* fileline, char* );
void* search_salaries(void *_args);
int search_salaries_id(char* emp_name, char *job_title, char* status);
void server();
int ensure_correct_line(char* file_line, char* emp_id){
/* Function: ensure_correct_line
* ------------------------
*
* Ensure the id is matched at the beginning of the line.
*
* returns: bool value saying true or false if the line has emp_id in the beginning.
*/
char* first_value;
char copy_file_line[512];
int does_match;
strcpy(copy_file_line, file_line);
first_value = strtok(copy_file_line, ",");
if (strcmp(first_value, emp_id) == 0){
return 0;
};
return 1;
}
void* search_salaries(void *_args) {
/* Function: search_salaries
* ------------------------
*
* Gets the information needed from the salary sheet for a given employee id.
*
* returns: void
*/
FILE *fp;
char temp[512];
char* correct_salary_line;
int correct_line;
struct salary_input *args = (struct salary_input *) _args;
fp = fopen("salaries.txt", "r");
char *emp_id = args->id;
while (fgets(temp, 512, fp) != NULL){
if((strstr(temp, emp_id)) != NULL){
//printf("%s", temp);
correct_line = ensure_correct_line(temp, emp_id);
//printf("%s", temp);
if (correct_line == 0){
break;
}
}
}
strcpy(args->s->id, strtok(temp, ","));
strcpy(args->s->job_title, strtok(NULL, ","));
strcpy(args->s->pay, strtok(NULL, ","));
strcpy(args->s->overtime_pay, strtok(NULL, ","));
strcpy(args->s->benefit, strtok(NULL, ","));
strcpy(args->s->status, strtok(NULL, ","));
free(args);
}
void* search_satisfaction(void *_args) {
/* Function: search_satisfaction
* ------------------------
*
* Gets the information needed from the satisfaction sheet for a given employee id.
*
* returns: void
*/
FILE *fp;
char temp[512];
char* correct_satisfaction_line;
int correct_line;
struct satisfaction_input *args = (struct satisfaction_input *) _args;
fp = fopen("satisfaction.txt", "r");
char *emp_id = args->id;
while (fgets(temp, 512, fp) != NULL){
if((strstr(temp, emp_id)) != NULL){
//printf("%s", temp);
correct_line = ensure_correct_line(temp, emp_id);
//printf("%s", temp);
if (correct_line == 0){
break;
}
}
}
//printf("%s", temp);
strcpy(args->s->id, strtok(temp, ","));
strcpy(args->s->satisfaction_level, strtok(NULL, ","));
strcpy(args->s->number_project, strtok(NULL, ","));
strcpy(args->s->monthly_hours, strtok(NULL, ","));
strcpy(args->s->years_at_company, strtok(NULL, ","));
strcpy(args->s->work_accident, strtok(NULL, ","));
strcpy(args->s->promotion_give_years, strtok(NULL, ","));
free(args);
}
int search_salaries_id(char* emp_id, char *job_title, char* status){
/* Function: ensure correct ID is chosen from job title and status
* ------------------------
*
* Gets id for the correct employee
*
* returns: int
*/
FILE *fp;
fp = fopen("salaries.txt", "r");
char temp[512];
int test;
char* id_read;
char *job_title_read;
char *status_read;
while (fgets(temp, 512, fp) != NULL){
if((strstr(temp, emp_id)) != NULL){
id_read = strtok(temp, ",");
//printf("%s %s\n", id_read, emp_id);
if(strcmp(id_read, emp_id) == 0){
job_title_read = strtok(NULL, ",");
//printf("%s\n", job_title_read);
test = strcmp(job_title_read, job_title);
if(strcmp(job_title_read, job_title) == 0){
strtok(NULL, ",");
strtok(NULL, ",");
strtok(NULL, ",");
status_read = strtok(NULL, ",");
if(strcmp(status_read, status) == 10){
return 0;
}
}
}
}
}
return 1;
}
char* get_id_from_line(char* file_line){
/* Function: get_id_from_line
* ------------------------
*
* Gets id for employee from the line found in the text file.
*
* returns: int
*/
char *id;
id = strtok(file_line, ",");
return id;
}
char* get_id(char* emp_name, char* job_title, char *status){
/* Function: get_id
* ------------------------
*
* Gets id for employee from provided employee name
*
* returns: int
*/
char temp[512];
int correct_id;
char* name_id;
FILE *fp;
fp = fopen("id_name.txt", "r");
/* Loop through the file looking for the line containing the name */
while (fgets(temp, 512, fp) != NULL){
if((strstr(temp, emp_name)) != NULL){
name_id = get_id_from_line(temp);
correct_id = search_salaries_id(name_id, job_title, status);
//printf("%d\n", correct_id);
if(correct_id == 0){
printf("%s\n", temp);
break;
}
}
}
return name_id;
}
void server() {
// Declare socket variables
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[100];
// Creating socket file descriptor
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// Forcefully attaching socket to the port 8080
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// Forcefully attaching socket to the port 8080
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
/* Declare variables */
char* emp_id;
struct salary_sheet *ss = malloc(sizeof (struct salary_sheet));
struct salary_input *si = malloc(sizeof (struct salary_input));
struct satisfaction_sheet *sat_sheet = malloc(sizeof (struct satisfaction_sheet));
struct satisfaction_input *sat_in = malloc(sizeof (struct satisfaction_input));
char emp_name[100] = "Benjamin Tai";
char emp_job_title[100] = "Registered Nurse";
char emp_status[100] = "PT";
while ( (valread = read(new_socket, buffer, 100)) > 0) {
printf("Name received from the client: %s\n", buffer);
read(new_socket, buffer, 100);
printf("Job title recieved from client: %s\n", buffer);
read(new_socket, buffer, 100);
printf("Status received from the client: %s\n", buffer);
//Get ID from name.
emp_id = get_id(emp_name, emp_job_title, emp_status);
//Set up structs to pass to threads
strcpy(si->id, emp_id);
si->s = ss;
strcpy(sat_in->id, emp_id);
sat_in->s = sat_sheet;
//Create salary sheet thread
pthread_t sal_thread_id;
pthread_create(&sal_thread_id, NULL, search_salaries, si);
pthread_join(sal_thread_id, NULL);
//Create satisfaction thread
pthread_t sat_thread_id;
pthread_create(&sat_thread_id, NULL, search_satisfaction, sat_in);
pthread_join(sat_thread_id, NULL);
//Send back salary sheet info
send(new_socket, emp_name, 100, 0);
send(new_socket, si->s->id, 100, 0);
send(new_socket, si->s->job_title, 100, 0);
send(new_socket, si->s->pay, 100, 0);
send(new_socket, si->s->overtime_pay, 100, 0);
send(new_socket, si->s->benefit, 100, 0);
send(new_socket, si->s->status, 100, 0);
//Send back satisfaction sheet info
send(new_socket, sat_in->s->satisfaction_level, 100, 0);
send(new_socket, sat_in->s->number_project, 100, 0);
send(new_socket, sat_in->s->monthly_hours, 100, 0);
send(new_socket, sat_in->s->years_at_company, 100, 0);
send(new_socket, sat_in->s->work_accident, 100, 0);
send(new_socket, sat_in->s->promotion_give_years, 100, 0);
printf("Stuff Sent\n");
memset(buffer, 0, 100);
}
}