Salve a tutti
sto cercando di sviluppare un server concorrente in c++ utilizzando i thread. mi aiutate per favore a capire che cosa non va? non riesco ad individuare l'errore. vi allego il codice, grazie
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#define BACKLOG_SIZE 5
#define SRV_PORT 1024
using namespace std;
void *f(void *arg)
{
cout <<"SERVER: Connessione ricevuta dal client "<<endl;
//codice da fare eseguire al server per gestire la richiesta da parte dei clients
// close((int *)arg);
}
int main(void)
{
int ret, len;
int sk, cl_sk;
int optval;
struct sockaddr_in my_addr, cl_addr;
char cl_paddr[INET_ADDRSTRLEN];
uint16_t cl_port;
pthread_t tid;
unsigned int msg_len;
char *msg;
sk = socket(AF_INET, SOCK_STREAM, 0);
if(sk == -1){
cout <<"SERVER: Impossibile creare un nuovo socket"<<endl;
exit(1);
}
/* reuse a TIME_WAIT socket */
optval = 1;
ret = setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
if(ret == -1){
cout<<"CLIENT: Error on setting SO_REUSEADDR"<<endl;
exit(1);
}
memset(&my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
my_addr.sin_port = htons(SRV_PORT);
ret = bind(sk, (struct sockaddr *) &my_addr, sizeof(my_addr));
if(ret == -1){
cout <<"SERVER: Errore nella bind "<<endl;
exit(1);
}
ret = listen(sk, BACKLOG_SIZE);
if(ret == -1){
cout << "SERVER: Impossibile creare una coda di backlog di "<<BACKLOG_SIZE<< "connessioni"<<endl;
exit(1);
}
cout << "SERVER: in ascolto di connessioni sulla porta "<<SRV_PORT<<endl;
while(1){
len = sizeof(cl_addr);
cl_sk = accept(sk, (struct sockaddr *) &cl_addr, (socklen_t*)&len);
if(cl_sk == -1){
cout <<"SERVER: Errore nella accept"<<endl;
exit(1);
}
//inet_ntop(AF_INET, &cl_addr.sin_addr, cl_paddr, sizeof(cl_paddr));
//cl_port = ntohs(cl_addr.sin_port);
//cout <<"SERVER: Connessione ricevuta dal client "<<cl_paddr<< " sulla porta " <<cl_port<<endl;
pthread_create(&tid, NULL, f, (void *) cl_sk);
pthread_detach(tid);
}
close(sk);
exit(0);
}