неверное преобразование из int в socklen - PullRequest
5 голосов
/ 08 февраля 2012

Ниже приведен мой код для Linux.Я реализую клиент-серверное приложение, и ниже находится файл .cpp сервера.

int main()
{
 int serverFd, clientFd, serverLen, clientLen;
struct sockaddr_un serverAddress;/* Server address */
struct sockaddr_un clientAddress; /* Client address */
struct sockaddr* serverSockAddrPtr; /* Ptr to server address */
struct sockaddr* clientSockAddrPtr; /* Ptr to client address */

/* Ignore death-of-child signals to prevent zombies */
signal (SIGCHLD, SIG_IGN);

serverSockAddrPtr = (struct sockaddr*) &serverAddress;
serverLen = sizeof (serverAddress);

clientSockAddrPtr = (struct sockaddr*) &clientAddress;
clientLen = sizeof (clientAddress);

/* Create a socket, bidirectional, default protocol */
serverFd = socket (AF_LOCAL, SOCK_STREAM, DEFAULT_PROTOCOL);
serverAddress.sun_family = AF_LOCAL; /* Set domain type */
strcpy (serverAddress.sun_path, "css"); /* Set name */
unlink ("css"); /* Remove file if it already exists */
bind (serverFd, serverSockAddrPtr, serverLen); /* Create file */
listen (serverFd, 5); /* Maximum pending connection length */   

readData();

while (1) /* Loop forever */
  {
    /* Accept a client connection */
    clientFd = accept (serverFd, clientSockAddrPtr, &clientLen);

    if (fork () == 0) /* Create child to send recipe */
      {
        printf ("");
    printf ("\nRunner server program. . .\n\n");
    printf ("Country Directory Server Started!\n");

        close (clientFd); /* Close the socket */
        exit (/* EXIT_SUCCESS */ 0); /* Terminate */
      }
    else
      close (clientFd); /* Close the client descriptor */
  }

}

Когда я пытался скомпилировать, он отображает сообщение об ошибке, которое показывает.

 server.cpp:237:67: error: invalid conversion from ‘int*’ to ‘socklen_t*’
server.cpp:237:67: error:   initializing argument 3 of ‘int accept(int, sockaddr*, socklen_t*)’

Это указывает на эту строку

clientFd = accept (serverFd, clientSockAddrPtr, &clientLen);

На самом деле я не знаю, как решить эту проблему.Заранее спасибо тем, кто помог!:)

Ответы [ 2 ]

11 голосов
/ 08 февраля 2012

Определить clientLen как socklen_t:

socklen_t clientLen;

вместо

int clientLen;
3 голосов
/ 02 июня 2014

Изменение

clientFd = accept (serverFd, clientSockAddrPtr, &clientLen);

до

clientFd = accept (serverFd, clientSockAddrPtr,(socklen_t*)&clientLen);
...