I made a program and now I need to make it concurrent.
Can someone pls help me do this ?
The code is this:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
/* portul folosit */
#define PORT 4256
struct operation
{
int number1;
int number2;
int number3;
int number4;
int number5;
};
/* codul de eroare returnat de anumite apeluri */
extern int errno;
/* programul */
int main (int argc, char * argv[])
{
struct sockaddr_in server; /* structurile folosite de server si client */
struct sockaddr_in from;
struct operation request; /* cererea primita de server */
int sd; /* descriptorul de socket */
int port;
/* setare port in cazul specificarii explicite */
if (argc > 1)
{
port = atoi(argv[1]);
}
else
port = PORT;
/* cream un socket */
if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
perror ("Eroare la socket().\n");
return errno;
}
/* pregatim structurile de date */
bzero (&server, sizeof (server));
bzero (&from, sizeof (from));
/* umplem structura folosita de server */
server.sin_family = AF_INET;
/* stabilirea familiei de socket-uri */
server.sin_addr.s_addr = htonl (INADDR_ANY);
/* acceptam orice adresa */
server.sin_port = htons (port);
/* utilizam un port utilizator */
/* atasam socketul */
if (bind (sd, (struct sockaddr *) &server, sizeof (struct sockaddr)) == -1)
{
perror ("Eroare la bind().\n");
return errno;
}
/* punem serverul sa asculte daca vin clienti sa se conecteze */
if (listen (sd, 3) == -1)
{
perror ("Eroare la listen().\n");
return errno;
}
/* servim in mod iterativ clientii... */
while (1)
{
int client;
int length = sizeof (from);
printf ("Asteptam la portul %d...\n", port);
fflush (stdout);
/* acceptam un client (ne vom bloca pina la realizarea conexiunii) */
client = accept (sd, (struct sockaddr *) &from, &length);
/* eroare la acceptarea conexiunii de la un client */
if (client < 0)
{
perror ("Eroare la accept().\n");
continue;
}
/* am realizat conexiunea, asteptam mesajul... */
bzero (&request, sizeof(struct operation));
printf ("Asteptam cererea...\n");
fflush (stdout);
/* citirea mesajului */
int nrbytes = recv (client, &request, sizeof(struct operation), 0);
if (nrbytes <= 0)
{
perror ("Eroare la read() de la client.\n");
close (client); /* inchidem conexiunea cu clientul */
continue; /* continuam sa ascultam... */
}
if (nrbytes < sizeof(struct operation))
{
perror ("Date primite incomplet");
close (client);
continue;
}
request.number1 = ntohl(request.number1);
request.number2 = ntohl(request.number2);
request.number3 = ntohl(request.number3);
request.number4 = ntohl(request.number4);
request.number5 = ntohl(request.number5);
printf ("Cerere primita... \n In curs de rezolvare: %d %d %d %d %d \n",
request.number1, request.number2, request.number3, request.number4, request.number5);
/* rezolvarea cererii */
int magic;
int a=0;
int b=0;
int c=0;
int d=0;
int e=0;
int min=0;
int result;
magic = rand() % 1001; /* generarea numarului magic de la 1 la 1000*/
/* diferenta dintre numarul magic si numerele primite */
if (magic >= request.number1)
a = magic - request.number1;
else
a = request.number1 - magic;
if (magic >= request.number2)
b = magic - request.number2;
else
b = request.number2 - magic;
if (magic >= request.number3)
c = magic - request.number3;
else
c = request.number3 - magic;
if (magic >= request.number4)
d = magic - request.number4;
else
d = request.number4 - magic;
if (magic >= request.number5)
e = magic - request.number5;
else
e = request.number5 - magic;
printf("\nnumar magic: %d\n", magic);
printf("numerele sunt: %d %d %d %d %d\n", a, b, c, d, e);
/* verificare care numar este mai aproape de numarul magic */
if (a > b)
min = b;
else min = a;
if (min > c)
min = c;
if (min > d)
min = d;
if (min > e)
{
min = e;
//result = min;
}
printf("diferenta minima este: %d", min);
/*selectam numarul care este mai apropiat de numarul magic*/
if (min == a)
result = request.number1;
if (min == b)
result = request.number2;
if (min == c)
result = request.number3;
if (min == d)
result = request.number4;
else
result = request.number5;
result = htonl(result);
/* returnam rapunsul clientului */
if (send (client, &result, sizeof(int),0) <= 0)
{
perror ("Eroare la write() catre client.\n");
continue; /* continuam sa ascultam */
}
else
printf (" trasmitere cu succes.\n");
/* am terminat cu acest client, inchidem conexiunea */
close (client);
} /* while */
} /* main */
The program is a client/server. The server generates a random number and the clients(maximum 3) have to guess that number. The sever will only take the first 5 numbers from every client and see wich one is closest. The one that guesses the number or is the clossest will get a message that will say that he guessed the number!
Can someone pls help me make my server to be concurrent and to send messages to the one that is the closest ?
Now my program only gets the 5 numbers from the client, checks wich number is closest to the random number(the magic number) and returns that number to the client!
I tried to change it and use the fork() function but i got stuck because i got lots of errors and didn't knew how to resolve them!