Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di mr.and
    Registrato dal
    Dec 2008
    Messaggi
    51

    [C]Invalid argument su accept()

    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??

  2. #2
    Utente di HTML.it L'avatar di mr.and
    Registrato dal
    Dec 2008
    Messaggi
    51
    risolto...dimenticavo di inizializzare sin_size!!!

    Grazie lo stesso a tutti!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.