2011-02-03 53 views
0

在下一个代码中,虽然我尝试连接客户端,但服务器显示以下错误: “invalid argument”,我看不到错误。为什么在尝试接受连接时出现“无效参数”?

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.

所以,你需要初始化传入acceptsizeof(cli_dir)的的tam值。幸运的是,套接字库能够捕捉到您的错误,因为您传递的是未初始化的内存,导致未定义的行为。

+0

就是这样,非常感谢。我认为变量tam只是一个输出值,所以我甚至不认为它需要一个初始值。 – 2011-02-04 14:38:59

相关问题