c- accept()更改服务器套接字描述符



我正在实现一个简单的套接字。但是,服务器程序出现了分段故障问题,我发现在调用Accept((函数后,服务器套接字描述符被更改为错误的值。我附上了下面代码的一部分。我找不到通过Accept((函数更改套接字描述符值的原因。我的代码有什么问题?谢谢。

while(1)
{
  readFdSet = allFdSet;
  // Call the select() function to check the change of input stream
  if(select(maxFd+1, &readFdSet, NULL, NULL, NULL) == -1)
  {
    printf("Fail to select the fdn");
    exit(1);
  }
  // Check the connection request to serverSocket
  if(FD_ISSET(serverSocket, &readFdSet))
  {
    // Accept the connection request from the client
    clientAddrSize = sizeof(clientAddr);
    // It prints 'serverSocket: 3'
    printf("serverSocket: %dn", serverSocket);
    clientSocket =  accept(serverSocket, (struct sockaddr *)&clientSocket, &clientAddrSize);
    // It prints 'serverSocket: 16777343'
    printf("serverSocket: %dn", serverSocket);
    if(clientSocket == -1)
    {
      printf("Fail to accept a clientn");
      exit(1);
    }
    else
      printf("Accept a client, fd = %dn", clientSocket);
    // Add the fd of clientSocket into allFdSet
    FD_SET(clientSocket, &allFdSet);
    if(clientSocket > maxFd)
    {
      maxFd = clientSocket;
    }
    continue;
  }
  for(int i=0; i<=maxFd; i++)
  {
    clientSocket = i;
    if(FD_ISSET(clientSocket, &readFdSet))
    {
      // Read the message from the client 
      memset(buff, 0, BUFF_SIZE);
      while(read(clientSocket, buff, BUFF_SIZE)>0)
      {
        printf("%s", buff);
        memset(buff, 0, BUFF_SIZE);
      }
      close(clientSocket);
      FD_CLR(clientSocket, &allFdSet);
      if(maxFd == clientSocket)
        maxFd--;
      printf("Close the connectionn");
    }
  }
}
clientSocket =  accept(serverSocket, (struct sockaddr *)&clientSocket, &clientAddrSize);

问题在这里。clientSocket是FD,而不是sockaddr,它没有大小,即sizeof(clientAddr)。因此,accept()将在clientSocket之前或之后损坏任何可能是serverSocket或其他任何东西。

应该是:

clientSocket =  accept(serverSocket, (struct sockaddr *)&clientAddr, &clientAddrSize);

@christurner首先暗示。

最新更新