Chinaunix首页 | 论坛 | 博客
  • 博客访问: 619258
  • 博文数量: 69
  • 博客积分: 1891
  • 博客等级: 上尉
  • 技术积分: 1359
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-20 23:38
文章分类

全部博文(69)

文章存档

2012年(46)

2011年(23)

分类: C/C++

2011-05-24 01:32:22

验证可以直接发送数据到浏览器。

这部是用来验证服务器和浏览器之间的HTTP协议的工作原理以及流程的。


  1. #include <stdio.h>

  2. #include </home/kenvi/program/unpv13e/lib/unp.h>

  3. int main(int argc,char **argv){

  4. int listenfd,connfd;

  5. socklen_t len;

  6. //要发送的数据

  7. char* buff="HTTP/1.1 200 OK\n"

  8. "Date: Fri, 15 Jan 2010 15:56:41 GMT\n\ntesthello world";

  9. char recvbuf[MAXLINE];

  10. struct sockaddr_storage cliaddr;

  11. if(argc!=2)

  12. err_quit("usage:cgi1 ");

  13. listenfd=Tcp_listen(NULL,argv[1],NULL);//监听

  14. for(;;){

  15. len=sizeof(cliaddr);

  16. connfd=Accept(listenfd,(SA*)&cliaddr,&len);
  17. printf("connection from %s\n",Sock_ntop((SA*)&cliaddr,len));

  18. int nbyte;

  19. int flag=0,n1=0,n2=0,count=0;

  20. //读取数据

  21. while((nbyte=Read(connfd,recvbuf,MAXLINE))>0){

  22. recvbuf[nbyte]='\0';

  23. int i;

  24. //找到连续的两个回车换行,然后退出。

  25. for(i=0;i<nbyte;i++){

  26. if(recvbuf[i]=='\n'){

  27. if(n1!=n2){

  28. n2=n1;

  29. n1=i+count;

  30. if(n1==n2+2){

  31. flag=1;

  32. break;

  33. }

  34. }

  35. else{

  36. n1=i+count;

  37. }

  38. }

  39. }

  40. count+=nbyte;

  41. if(flag)break;

  42. printf("%s %d,%d\n",recvbuf,n1,n2);

  43. }

  44. printf("sending...");

  45. Write(connfd,buff,strlen(buff));//发送数据

  46. Close(connfd);

  47. }

  48. }

注:该源码在Ubuntu 9.04上编译通过,需要unp网站上的头文件和库。


编译运行。

sudo CGI  80 //80端口需要root权限


打开浏览器,访问127.0.0.1

在终端中可以看到浏览器的请求信息:

---------------------------------------------

GET / HTTP/1.1

Host: 127.0.0.1

User-Agent: Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.0.17) Gecko/2010010604 Ubuntu/9.04 (jaunty) Firefox/3.0.17

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,zh;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

---------------------------------------------

注意:在请求信息的末尾有两个空行,这是请求消息结束的标志。


而我的程序向端口,即是浏览器写入的内容如下:

---------------------------------------------

HTTP/1.1 200 OK

Date: Fri, 15 Jan 2010 15:56:41 GMT


testhello world

-----------------------------------------------

中间也有一个空行,前面部分数据是给浏览器处理的,而后面的则是让浏览器呈现个用户的信息。很显然,我们的程序是将网页的源代码发送给了浏览器然后交给浏览器处理。

阅读(1565) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~