sicuro?
forse mi sono spiegato male.
Il server fa un fork quindi dovrebbe essere in attesa il figlio, se metto non bloccante ho un errore in fase di esecuzione.
Un socket e' bloccante quando, a seguito di una chiamata alla funzione di attesa per una connessione, blocca il thread in cui e' stata creata, fino all'arrivo di una richiesta di connessione.
Con un socket non bloccante, invece, non si ha una attesa indefinita. Se al momento della verifica, non e' presente alcuna richiesta di connessione, allora il thread continuera' con la propria esecuzione senza bloccarsi.
Comunque posto interemante il codice sia del client sia del server:
server
codice:
int server(){
struct hostent * host ;
struct sockaddr_in addr ;
struct sockaddr_in client ;
socklen_t size_sock ;
bzero(&(addr), sizeof(addr));
addr.sin_family = AF_INET ;
addr.sin_port = htons(8000) ;
size_sock = sizeof(struct sockaddr);
addr.sin_addr.s_addr = ((struct in_addr *)(host->h_addr_list[0]))->s_addr;
addr.sin_addr.s_addr = htonl(INADDR_ANY) ;
memset(addr.sin_zero , '\0', sizeof(addr.sin_zero));
if((tcp_sk=socket(PF_INET , SOCK_STREAM, 0))==-1){
perror("Error initialazing");
exit(0);
}
if((bind(tcp_sk , (struct sockaddr *)(&addr) , sizeof(addr) ))<0){
perror("Error bind");
exit(-1);
}
if(listen(tcp_sk , 2) < 0){
perror("Error listen");
exit(-1);
}
while(1){
if((new_sk=(accept(tcp_sk , (struct sockaddr *)&client , &size_sock))) < 0 ){
perror("Error accept");
exit(-1);
}
pthread_mutex_lock(&mutex_db);
if((pid=fork())==0){
close(tcp_sk);
printf("Client:%s\n",inet_ntoa(client.sin_addr));
richiesta(new_sk);
close(new_sk);
exit(2); /* figlio termina */
}else{
close(new_sk);
int va;
wait(&va);
pthread_mutex_unlock(&mutex_db);
}//if-else del fork
richiesta
codice:
void richiesta(int new_sk){
int scelta;
char buff[100];
int size = read_msg(new_sk ,buff , 100);
buff[size] = '\0';
printf("Valore ricevuto:%s\n" , buff);
}
client
codice:
int main(){
int size=0;
int tcp_sk;
struct sockaddr_in addr ;
bzero(&(addr), sizeof(addr));
addr.sin_family = AF_INET ;
addr.sin_port = htons(8000) ;
addr.sin_addr.s_addr = inet_addr( "127.0.0.1" ) ;
memset(addr.sin_zero , '\0', sizeof(addr.sin_zero));
char choice= "w";
printf("Valore passato:%c\n" , choice[0]);
if((tcp_sk=socket(PF_INET , SOCK_STREAM, 0))==-1){
perror("Error socket\n");
exit(0);
}
//chiedo la connessione!!!!!
if(connect(tcp_sk, (struct sockaddr *)&(addr) ,sizeof(addr) ) !=0){
perror("Error connect\n");
exit(0);
}
int size= invio_msg(tcp_sk , choice , sizeof(char));
printf("Valori scritti: %d\n" , size);
read_and_format(tcp_sk);
close(tcp_sk);
}//main
int read_and_format(int tcp_sk){
int size;
char parola[100];
while((size = read_msg(tcp_sk ,parola , 100 )) !=0){
if(size == -1){
printf("Errore in lettura\n");
return -1;
}
printf("Stringa: %s \n " ,parola);
}//while
}//read_and_format
Il client resta giustamente in attesa che il server restituisca dei dati, ma il server e' bloccato.
Quando killo il client dall'altra parte si stampa il carattere che ho passato tramite il socket.