Salve,
sto creando una applicazione server , sotto Linux, ma ho riscontrato un problema: la accept mi da errore "Invalid argument", ma a me sembra tutto ok...posto il codice:

codice:
#include <stdio.h>
#include <malloc.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <fcntl.h>
#include <dirent.h>
#include <pthread.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define INVALID_SOCKET -1

typedef  struct sockaddr_in SOCKADDR_IN;
typedef int SOCKET;
typedef long LONG;

int main(int argc, char* argv []){


   SOCKADDR_IN Client_addr;
   SOCKET listenSocket;
   SOCKET connessione;
   int id_serv,sin_size,i,n;
   LONG cnt;
   LONG volatile flag;
   LONG volatile client[MAX_SERV];
   serv_arg* param;
   fd_set rset;
   struct timeval tv;
   u_long iMode;
   pthread_t t1;
   pthread_t t[MAX_SERV];


   id_serv=0;
   for(i=0;i<MAX_SERV;i++) client[i]=0;


/*Inizializzazione connessione server*/

   listenSocket=ConnessioneServer("127.0.0.1",N_PORT,listenSocket);
   printf("listensocket:%d\n",listenSocket);
   if(listenSocket==INVALID_SOCKET){
                      		    perror("Errore ConnessioneServer");
                      		    return -1;
   }
   
   iMode=1;

   SetSocket(listenSocket,iMode);

   flag=1;

   printf("Mainserver in attesa di client..\n");

   while(flag){

            FD_ZERO(&rset);
            FD_SET(listenSocket, &rset);
            tv.tv_sec = 10;
            tv.tv_usec = 0;
            if( (n = select(listenSocket + 1, &rset, NULL, NULL, &tv)) < 0 ){
                                                                             ChiudiSocket(listenSocket);
                                                                             perror("Errore Select");
                                                                             return -1;
            }
            if(n>0){
                       connessione = accept(listenSocket, (struct sockaddr*)&Client_addr, &sin_size);
                       if(connessione<=0) perror("Errore Accept");

	               printf("Accettata Connessione con Client: %s su socket %d\n", inet_ntoa(Client_addr.sin_addr),connessione);

                       param=malloc(sizeof(serv_arg));

                       for(i=0;i<MAX_SERV;i++) { 
                                                if(client[i]==0){ 
                                                                  client[i]++;
                                                                  break; 
                                                }
                                                if(i==MAX_SERV-1){
                                                                  sleep(5000);
                                                                  i=0;
                                                }
                       }
                       
                       iMode=0;

                       SetSocket(connessione,iMode);

                       (*param).nserv=client+i;
                       (*param).idServ=i;
                       (*param).conn=connessione;
                       (*param).clientAddr.sin_family = AF_INET;
                       (*param).clientAddr.sin_addr.s_addr=Client_addr.sin_addr.s_addr;
                       (*param).clientAddr.sin_port=Client_addr.sin_port;

                       pthread_create(t+i,NULL,&server,(void*)param);

	    }
   }


/*quindi termina */

   ChiudiSocket(listenSocket);

   return 0;

}
dove questa è la funzione ConnessioneServer:

codice:
int ConnessioneServer(char* addr,int port,SOCKET listenSocket){
  
  SOCKADDR_IN Server_addr;
  SOCKADDR_IN Client_addr;
  int sin_size;
  
  listenSocket = socket(AF_INET, SOCK_STREAM, 0);
  if (listenSocket < 0) { perror("ConnessioneServer,Errore socket");
                          ChiudiSocket(listenSocket);
                          return -1; }
  
  Server_addr.sin_family = AF_INET;
  Server_addr.sin_addr.s_addr = inet_addr(addr);;
  Server_addr.sin_port = htons(port);

  sin_size = sizeof(SOCKADDR_IN);
  
  if (bind(listenSocket,(struct sockaddr*)&Server_addr,sin_size) < 0){
     perror("ConnessioneServer,Errore bind");
     ChiudiSocket(listenSocket);
     return -1; }
  
  if((listen(listenSocket, MAX_SERV))<0) { perror("ConnessioneServer,Errore listen");
                                            ChiudiSocket(listenSocket);
                                            return -1; }
  return listenSocket;
  
}

Ma questa funzione sembra funzionare bene, non mi da nessun errore infatti il socket ritornato ha valore 3.
Qualcuno sa il perchè di questo problema??