Untitled
unknown
plain_text
a year ago
4.6 kB
5
Indexable
#include "sd1.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <unistd.h>
#define PORT 8880
#define SERVER_IP "127.0.0.1"
struct socketInfo {
int sockfd;
char *host;
};
void *menu_use(void *arg) {
struct socketInfo *info = (struct socketInfo *)arg;
int sockfd = info->sockfd;
char *host = info->host;
CLIENT *clnt;
clnt = clnt_create(host, FUNC_PROG, FUNC_VERS, "tcp");
if (clnt == NULL) {
clnt_pcreateerror(host);
pthread_exit(NULL);
}
printf("Connected.\n");
int clnt_choice, N, t;
int *temp;
float a;
do {
t = recv(sockfd, &clnt_choice, sizeof(int), 0);
if (t <= 0) {
printf("ERROR receiving from socket client\n");
break;
}
if (clnt_choice == 1 || clnt_choice == 2 || clnt_choice == 3) {
t = recv(sockfd, &N, sizeof(int), 0);
if (t <= 0) {
printf("ERROR receiving from socket client\n");
continue;
}
temp = (int *)malloc(N * sizeof(int));
if (temp == NULL) {
printf("ERROR allocating memory\n");
continue;
}
t = recv(sockfd, temp, N * sizeof(int), 0);
if (t <= 0) {
printf("ERROR receiving from socket client\n");
free(temp);
continue;
}
if (clnt_choice == 1) {
N_array averagefunc_1_arg;
averagefunc_1_arg.N.N_len = N;
averagefunc_1_arg.N.N_val = temp;
float *result_1 = mean_value_1_svc(&averagefunc_1_arg, NULL);
send(sockfd, result_1, sizeof(float), 0);
} else if (clnt_choice == 2) {
N_array minmaxfunc_1_arg;
minmaxfunc_1_arg.N.N_len = N;
minmaxfunc_1_arg.N.N_val = temp;
max_min *result_2 = minmax_1_svc(&minmaxfunc_1_arg, NULL);
int min_max[2] = {result_2->min, result_2->max};
send(sockfd, min_max, 2 * sizeof(int), 0);
} else if (clnt_choice == 3) {
new_array productfunc_1_arg;
productfunc_1_arg.N.N_len = N;
productfunc_1_arg.N.N_val = temp;
t = recv(sockfd, &a, sizeof(float), 0);
if (t <= 0) {
printf("ERROR receiving from socket client\n");
free(temp);
continue;
}
productfunc_1_arg.constant = a;
new_array_production *result_3 = productarray_1_svc(&productfunc_1_arg, NULL);
send(sockfd, result_3->product.product_val, N * sizeof(float), 0);
}
free(temp);
} else if (clnt_choice == 0) {
printf("CLIENT DISCONNECTING....\n");
break;
} else {
printf("CLIENT'S INVALID CHOICE..WAITING FOR NEW CHOICE...\n");
}
} while (1);
clnt_destroy(clnt);
close(sockfd);
free(info);
pthread_exit(NULL);
}
int main() {
int sockfd, newsockfd, clilen, i = 0;
struct sockaddr_in serv_addr, cli_addr;
pthread_t thread[10];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
printf("ERROR opening socket\n");
exit(1);
}
bzero((char *)&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
printf("ERROR on binding\n");
close(sockfd);
exit(1);
}
listen(sockfd, 5);
while (1) {
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, (socklen_t *)&clilen);
if (newsockfd < 0) {
printf("ERROR on accept\n");
continue;
}
struct socketInfo *info = (struct socketInfo *)malloc(sizeof(struct socketInfo));
if (info == NULL) {
printf("ERROR allocating memory\n");
close(newsockfd);
continue;
}
info->host = SERVER_IP;
info->sockfd = newsockfd;
pthread_create(&thread[i++], NULL, menu_use, (void *)info);
if (i >= 10) {
for (int j = 0; j < 10; j++) {
pthread_join(thread[j], NULL);
}
i = 0;
}
}
close(sockfd);
return 0;
}
Editor is loading...
Leave a Comment