2011-02-03 10 views
0

В следующем коде, когда я пытаюсь подключиться к клиенту, на сервере отображается следующая ошибка: «Недопустимый аргумент», я не вижу ошибки.Почему у меня есть «Недопустимый аргумент» при попытке принять коннекты?

if((l_sock=socket(AF_INET,SOCK_STREAM,0))!=-1) 
{ 
    struct sockaddr_in srv_dir; 

    srv_dir.sin_family=AF_INET; 
    srv_dir.sin_port=8500; 
    srv_dir.sin_addr.s_addr=INADDR_ANY; 

    if((bind(l_sock,(struct sockaddr *)&srv_dir,sizeof(struct sockaddr_in)))!=-1) 
    { 
     if(!(listen(l_sock,5))) 
     { 
      signal(SIGINT,cerraje); 
      int t_sock; 
      struct sockaddr_in cli_dir; 
      socklen_t tam; 
      time_t tstmp; 
      struct tm * res; 
      res=(struct tm *)malloc(sizeof(struct tm)); 


      while(!key) 
      { 
       if((t_sock=accept(l_sock,(struct sockaddr *)&cli_dir,&tam))!=-1) 
       { 
        tstmp=time(&tstmp); 
        res=gmtime(&tstmp); 
        send(t_sock,res,sizeof(struct tm),0); 
        wr_hora(*res,cli_dir.sin_addr);   
       } 
       else 
        perror("Petición no atendida");//The error is printed here. 

спасибо.

ответ

9

Прочитайте документацию по accept(2):

The addrlen argument is a value-result argument: it should initially contain the size of the structure pointed to by addr; on return it will contain the actual length (in bytes) of the address returned. When addr is NULL nothing is filled in.

Таким образом, вы должны инициализировать значение tam переходила в accept с sizeof(cli_dir). Вам повезло, что библиотека сокетов удалось поймать вашу ошибку, потому что вы проходите в неинициализированной памяти, что приводит к неопределенному поведению.

+0

Все, спасибо. Я предположил, что переменная tam была только выходным значением, поэтому я даже не думаю, что ей нужно начальное значение. –