如何在收到HTTP请求时获取客户端的名称?

时间:2012-04-19 20:27:42

标签: c http sockets network-programming

我正在用C语言编写一个基本的代理服务器。

我想通过名称或IP识别我收到请求的服务器/机器。

如何做到这一点?我不知道从哪里获取信息。

这是我的连接代码:

  unsigned short port = atoi(argv[1]); /* port number to listen on */

  struct sockaddr_in server;
  server.sin_family = PF_INET;
  server.sin_addr.s_addr = INADDR_ANY;
  server.sin_port = htons( port );
                    /* host-to-network-short() convert to big endian */
  int len = sizeof( server );

  if ( bind( sock, (struct sockaddr *)&server, len ) < 0 )
  {
    perror( "bind() failed" );
    return EXIT_FAILURE;
  }

  /* activate the socket as a listener */
  listen( sock, 5 );   /* 5 is number of backlogged waiting client requests */
  //printf( "Listener socket created and bound to port %d on fd %d\n", port, sock );

  struct sockaddr_in client;

  while ( 1 )
  {
   // printf( "Blocked on accept()\n" );
    unsigned int fromlen;
    int newsock = accept( sock, (struct sockaddr *)&client, &fromlen );
                  /* accept() blocks */
    //printf( "Accepted client connection\n" );

    char buffer[5000];
    int n = read( newsock, buffer, 4999 );
    if ( n < 1 )
    {
      perror("Read() failed.\n");
    }
    else
    {
      buffer[n] = '\0';
      //printf( "Rcvd message from client: \n\n----\n\n%s\n\n----\n\n", buffer );
    }

1 个答案:

答案 0 :(得分:1)

以下是检索IP&amp;主机名:

struct sockaddr_in client;
[...]
 int newsock = accept( sock, (struct sockaddr *)&client, &fromlen );
printf("Client accepted: %s \n", inet_ntoa(client.sin_addr));  

// And the host name
struct hostent *hostName;
struct in_addr ipv4addr;

inet_pton(AF_INET, inet_ntoa(client.sin_addr), &ipv4addr);
hostName = gethostbyaddr(&ipv4addr, sizeof ipv4addr, AF_INET);
printf("Host name: %s\n", hostName->h_name);