调用accept()会给errno 14一个坏地址

时间:2014-11-17 13:51:31

标签: c sockets

我正在创建客户端和服务器应用程序,我目前正在尝试建立连接。每当客户端尝试连接到服务器时,服务器调用accept都会返回-1。当我检查从accept()设置的errno时,它是14代表坏地址。 我创建套接字和接受的代码如下

  //create socket
  if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0)
    {
      fprintf(stderr, "Cannot create server socket! errno %i: %s\n",errno,strerror(errno));
      exit(-1);
    }

  //bind to the socket
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port = htons(port);


  if( bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))<0)
    {
      printf("Server bind failure errno %i: %s\n",errno,strerror(errno));
      exit(-1);
    }

  // Turn 'listenfd' to a listening socket. Listen queue size is 5. 

  if(listen(listenfd,5) < 0)
    {
      printf("Server listen failure errno %i: %s\n",errno,strerror(errno));
      exit(-1);
    }
  while(1)
    {
      //accept connections
      if(newsock=accept(listenfd,(struct sockaddr*)&clientaddr,sizeof(clientaddr)<0))
    {
      printf("Server accept failure errno %i: %s\n",errno,strerror(errno));
      exit(-1);
    }
      int ch=fork();
      if(ch<0)
    {
      printf("Fork failure errno %i: %s\n",errno,strerror(errno));
      exit(-1);
    }
      else if (ch==0)
    {
      char buff[100];

      int rc;
      rc=recv(listenfd,buff,sizeof(buff),0);
      if(rc<0)
        {
          printf("Receive failure errno %i: %s\n",errno,strerror(errno));
          exit(-1);
        }

      printf("%s",buff);
      exit(-1);
    }

    }

我的服务器代码出错了什么?

1 个答案:

答案 0 :(得分:2)

if(newsock=accept(listenfd,(struct sockaddr*)&clientaddr,sizeof(clientaddr)<0))

在您的代码sizeof(clientaddr)<0中求值为0并作为最后一个参数传递给accept函数。替换为:

int addrlen;
...
addrlen = sizeof(clientaddr);
if((newsock=accept(listenfd,(struct sockaddr*)&clientaddr,&addrlen))<0)