wget curl c查看web服务器信息

发表于:2010-1-08 10:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
Linux
#
web

  来源于CU的一个帖子,问如何查看web服务器信息,忽然想起自己好像也比较想知道,遂google之

  [root@dbrg-2 ~]# curl -I www.baidu.com
  HTTP/1.1 200 OK
  Date: Wed, 29 Jul 2009 02:51:19 GMT
  Server: BWS/1.0
  Content-Length: 3509
  Content-Type: text/html
  Cache-Control: private
  Expires: Wed, 29 Jul 2009 02:51:19 GMT
  Set-Cookie: BAIDUID=0D5F54C0853B7C38D6BD3A3E5EA63C44:FG=1; expires=Wed, 29-Jul-39 02:51:19 GMT; path=/; domain=.baidu.com
  P3P: CP=" OTI DSP COR IVA OUR IND COM "
  [root@dbrg-2 ~]# wget -S --spider www.baidu.com
  --10:51:34-- http://www.baidu.com/
  => `index.html

  那么工具是实现了,如何用c来实现呢... 其实也很简单,我刚开始还走了点弯路想的是去查看wget or curl的源码,奈何那种代码相互之间依赖性太强实在不易阅读,于是自己用wireshark抓包, so easy!!!!有兴趣的自己去抓下

  #include <stdio.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <string.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <netdb.h>
  #define HTTPPORT 80
  char* head =
  "HEAD / HTTP/1.0\r\n"
  "Accept: */*\r\n"
  "User-Agent: Wget/1.10.2 (Red Hat modified)\r\n"
  "Host:127.0.0.1\r\n"
  "Connection: Keep-Alive\r\n\r\n";
  int connect_URL(char *domain,int port)
  {
  int sock;
  struct hostent * host;
  struct sockaddr_in server;
  host = gethostbyname(domain);
  if (host == NULL)
  {
  printf("gethostbyname error\n");
  return -2;
  }
  sock = socket(AF_INET,SOCK_STREAM,0);
  if (sock < 0)
  {
  printf("invalid socket\n");
  return -1;
  }
  memset(&server,0,sizeof(struct sockaddr_in));
  memcpy(&server.sin_addr,host->h_addr_list[0],host->h_length);
  server.sin_family = AF_INET;
  server.sin_port = htons(port);
  return (connect(sock,(struct sockaddr *)&server,sizeof(struct sockaddr)) <0) ? -1 : sock;
  }
  int main()
  {
  int sock;
  int ret;
  char buf[100];
  char *domain = "127.0.0.1";
  FILE* fp = fopen("test","w+");
  if(NULL == fp){
  printf("can't open stockcode file!\n");
  return -1;
  }
  sock = connect_URL(domain,HTTPPORT);
  if (sock <0){
  printf("connetc err\n");
  return -1;
  }
  send(sock,head,strlen(head),0);
  while(1)
  {
  if((ret=recv(sock,buf,100-1,0))<1)
  break;
  buf[ret]='\0';
  printf("%s", buf);
  fprintf(fp,"%s",buf); //save http data
  }
  fclose(fp);
  close(sock);
  //printf("bye!\n");
  return 0;
  }

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号