如何在套接字中运行服务器代码时打印客户端地址

时间:2011-09-20 09:55:19

标签: c linux

我正在尝试修改正在侦听不同客户端的服务器代码,现在我想打印一条像“从clinet地址获得连接”这样的行。但是我如何实现这一点。这是服务器代码。

  #include <stdio.h>
  #include <unistd.h>
  #include <stdlib.h>
  #include <string.h>
  #include <sys/types.h> 
  #include <sys/socket.h> 
  #include <netinet/in.h>

    int main(int argc, char *argv[])
 {


 int sockfd, newsockfd, portno, pid;

 socklen_t clilen;

 struct sockaddr_in serv_addr, cli_addr;

 if (argc < 2) {

     fprintf(stderr,"ERROR, no port provided\n");

     exit(1);
 }

 sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if (sockfd < 0) 
    error("ERROR opening socket");

  bzero((char *) &serv_addr, sizeof(serv_addr));
  portno = atoi(argv[1]);
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = INADDR_ANY;
  serv_addr.sin_port = htons(portno);
  if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 

          error("ERROR on binding");

 listen(sockfd,5);

 clilen = sizeof(cli_addr);
    while (1) 
   {

    newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, &clilen);

     if (newsockfd < 0) 
         error("ERROR on accept");

   printf("got connection from %s",&cli_addr);

     pid = fork();

     if (pid < 0)

     error("ERROR on fork");

      if (pid == 0) 
     {

         close(sockfd);

         exit(0);
     }
     else

    close(newsockfd);

     } /* end of while */

   close(sockfd);

   return 0; /* we never get here */
     }

Printf(“从%s获得连接”,&amp; cli_addr);

在这个特定的行中,我必须打印客户端地址

2 个答案:

答案 0 :(得分:2)

使用inet_ntoa函数将二进制IP地址转换为点表示法。

答案 1 :(得分:1)

使用inet_ntop显示客户端地址如下:

printf("Client Adress = %s",inet_ntop(AF_INET,&cli_addr.sin_addr,
                    clientname,sizeof(clientname)));