前往顾页
以后地位: 主页 > 收集编程 > .Net实例教程 >

支撑IPv4与IPv6双和谈栈的Web办事器设想实际教程

时候:2018-03-25 00:16来源:知行网www.zhixing123.cn 编辑:麦田守望者

嵌入式Web技术因其跨平台的特性获得了遍及的利用[1]。用户只需求登录浏览器便可实现对嵌入式装备状况的检察与节制。跟着物联网技术的生长,收集地点的需求量剧增,将来IPv6将在嵌入式范畴阐扬巨年夜的感化[2]。但是,目前IPv4技术还无法完整被新的IPv6技术所代替,这使得现有的利用法度必须同时兼容IPv4地点与IPv6地点。如安在嵌入式Web办事器中同时利用IPv4地点和IPv6地点则成了嵌入式范畴中的一个首要问题[3]。本文从实际利用解缆,设想了一个可以或许同时支撑IPv4与IPv6双和谈栈的嵌入式Web办事器。

  基来源根底理

  嵌入式Web办事器的基来源根底理是:用户在浏览器中输入嵌入式装备的IP地点,随后浏览器向嵌入式Web办事器发出HTTP请求,嵌入式Web办事器针对该请求作出HTTP呼应,最后浏览器对呼应的内容进行剖析,以网页的情势闪现给用户。嵌入式Web办事器道理如图1所示。

  HTTP要乞降呼应的报文是经由过程收集进行传输的。浏览器向Web办事器请求网页数据的详细流程如图2所示[4]。

  浏览器和Web办事器之间是经由过程TCP和谈进行通信的,TCP和谈是一种面向连接的、可靠的、基于字节流的传输层通信和谈。Web办事器监听特定的收集端口,当浏览器向Web办事器发出请求时,二者之间经由过程TCP和谈建立连接,然后传输HTTP请求报文和HTTP呼应报文。Web办事器实际上也是一个TCP办事器,典范的TCP办事器的架构如图3所示。

  针对当代农业物联网技术的利用需求,为了使体系中的嵌入式Web办事器在支撑IPv4地点拜候的根本上,还能支撑IPv6地点的拜候,本文遵循图3所示的典范TCP办事器架构设想了一个同时支撑IPv4地点与IPv6地点拜候请求的嵌入式Web办事器,详细实现过程以下。

设想实现

  为了进行浏览器与Web办事器之间的通信,起首就要建立收集连接,采取的体例为Socket通信。Socket又称为套接字,利用法度凡是环境下经由过程套接字向收集发出请求或应答收集请求[5]。Web办事器需求为每个与其连接的客户端分派一个socket套接字,作为相互通信的根本。传统的IPv4收集办事器建立socket描述符的代码以下所示:

  structsockaddr_inserver_addr;/*办事器端IP地点*/

  structsockaddr_inclient_addr;/*客户端IP地点*/

  sockfd=socket(AF_INET,SOCK_STREAM,0);

  bzero(&server_addr,sizeof(structsockaddr_in));

  server_addr.sin_family=AF_INET;

  server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

  server_addr.sin_port=htons(80);

  上述代码中,第一行和第二行别离定义了办事器和客户端的套接字地点变量。第三行代码的感化为办事器端建立socket描述符,AF_INET表白办事器利用的是IPv4和谈族,而SOCK_STREAM表白利用的是TCP和谈。第四行代码是为了清空sockaddr_in布局体变量,为添补内容做好筹办。第五行是为sockaddr_in布局体变量填入IPv4和谈族。第六行填入INADDR_ANY表白该办事器可以领受肆意IP地点的数据,即绑定到所有的IP地点。第七行是为sockaddr_in布局体变量填入80端标语,80端标语为Web办事器中的HTTO公用的端标语。

  参照IPv4办事器建立socket描述符的过程,为了实现对IPv6地点的支撑,对上述代码进行以下点窜:

  structsockaddr_in6server_addr;/*办事器端IP地点*/

  structsockaddr_in6client_addr;/*客户端IP地点*/

  server_socket=socket(PF_INET6,SOCK_STREAM,0));

  bzero(&server_addr,sizeof(structsockaddr_in6));

  server_addr.sin6_family=PF_INET6;

  server_addr.sin6_addr=in6addr_any;

  server_addr.sin6_port=htons(8080);

  新的Web办事器代码将sockaddr_in布局体变动成sockaddr_in6布局体,而sockaddr_in6布局体的成员以下所示:

  structsockaddr_in6{

  sa_family_tsin6_family;

  in_port_tsin6_port;

  structin6_addrsin6_addr;

  ……

  };

  成员sin6_family表白所利用的地点和谈族,PF_INET6表白利用的是IPv6和谈族;sin6_addr为Web办事器监听的IP地点,将其设为in6addr_any是要领受肆意IP地点发送的数据,即“INADDR_ANY”的IPv6版本;成员sin6_port则表白了Web办事器所利用的端口,利用8080端口而

  不是80端口的启事是为了不与嵌入式Linux装备上现有的Web办事器相抵触。用IPv6建立办事器端的话,即便客户端仍用IPv4的socket连接也能够一般通信,IPv4的地点会被转换成这类地点“::ffff:IPv4地点”,即IPv4映照地点。

  图4给出了浏览器向Web办事器发送的HTTP请求报文的格局,此中,URL是用户所需的资本。比方,当用户在浏览器地点栏输入“192.168.1.1:8080/index.html”时,HTTP请求报文的请求行动“GET/index.htmlHTTP/1.1”。从该行中便可获得用户所需的资本信息。设想的get_user_url(unsignedchar*url,unsignedchar*request)函数则可以获得浏览器所需的URL。随后,将按照该URL搜刮呼应的资本,并为组合HTTP呼应报文做好筹办。

  Web办事器的首要事情就是组合HTTP呼应报文,然后将其发送给请求网页的浏览器。HTTP呼应报文的格局如图5所示。

  HTTP请求报文和呼应报文的头部字段首要有Content-Length、Content-Type等。为了实现HTTP呼应报文的组合,本文设想了函数response_by_source(unsignedchar*source,intclient_socket)。该函数起首将机关HTTP呼应头部,然后和HTTP呼应报文的内容即用户请求的资本进行组合。函数代码以下所示:

  strcpy(response_buf,“HTTP/1.0200OK\r\n”);

  get_mime_type(mime_type,source);

  strcat(response_buf,mime_type);

  sprintf(response_tmp,“Content-Length:%ld\r\n”,file_size);

  strcat(response_buf,response_tmp);

  strcat(response_buf,“\r\n”);

  第1行的感化为机关HTTP呼应报文的状况行,向请求的办事器回应“HTTP/1.0200OK”,表白请求已成功,请求的呼应头或数据体将随此呼应前往。第2、3行的感化是为了机关头部字段Content-Type,函数get_mime_type(mime_type,source)的首要感化就是经由过程用户请求的URL得出请求资本的范例。第4行关头字Content-Length指的是用户请求的资本年夜小。第5行的感化是把HTTP呼应报文头部内容填入数据发送缓冲区中,Web办事器将会把数据发送缓冲区中的内容发送至浏览器。第6行动数据发送缓冲区中的内容增加一个空行,因为HTTP呼应报文的头部与内容要用一个换行符隔开。

  报文头部Content-Type表白了HTTP呼应报文的内容范例,浏览器将按照内容的范例来进行呼应的措置。get_mime_type(unsignedchar*mime_type,unsignedchar*source)的代码以下所示:

  /*服从:按照客户端的请求肯定应答的MIME范例*/

  voidget_mime_type(unsignedchar*mime_type,unsignedchar*source)

  {

  unsignedchar*pChar=NULL;/*字符指针*/

  unsignedchartype[20]={0};/*存放source字符串中的type信息*/

  pChar=strrchr(source,‘.’);/*寻觅source中最后一个‘.’号

  */

  strcpy(type,pChar);

  if(strncmp(type,“.html”,strlen(type))==0)

  {

  strcpy(mime_type,“Content-Type:text/html\r\n”);

  }

  elseif(strncmp(type,“.jpg”,strlen(type))==0)

  {

  strcpy(mime_type,“Content-Type:image/jpeg\r\n”);

  }

  elseif(strncmp(type,“.png”,strlen(type))==0)

  {

  strcpy(mime_type,“Content-Type:image/png\r\n”);

  }

  return;

  }

  上述代码目前可以对html、jpg和png

  格局的文件进行措置。如果需求对其他范例的文件进行措置,可以再进行恰当点窜。

  Content-Length为HTTP呼应报文中内容的长度,可以用以下代码进行计较:

  fseek(fp,0L,SEEK_END);

  file_size=ftell(fp);

  fseek(fp,0L,SEEK_SET);

  计较呼应报文内容长度的道理是将文件指针移到文件尾,然后计较出文件尾间隔文件头的间隔,便是文件的年夜小;计较结束后复原文件指针的地位。

  在对HTTP呼应报文的头部机关完成后,可以先将其进行发送,发送代码以下所示:

  write(client_socket,response_buf,http_header_len);

  如许便可以把HTTP呼应报文的头部发送给浏览器。接上去,就要对报文的内容进行发送。发送报文内容部分的代码对发送年夜文件进行了特别的措置,起首从文件中读取必然命量的内容,然后将其发送至浏览器。循环来去,直到读到文件尾为止,最后对文件进行封闭操纵。代码以下所示:

  do{

  unsignedinti=0;/*用于计数的变量*/

  /*从文件中读取20000个数据项,每个数据项的年夜小为1个字

  节,即读取20000字节的内容,前往实际读到的字节数*/

  read_count=fread(response_content_buf,1,20000,fp);

  for(i=0;i

  {

  response_buf[i]=response_content_buf[i];

  }

  /*分批发送HTTP应答报文中的内容*/

  if(write(client_socket,response_buf,read_count)==-1)

  {

  fprintf(stderr,“WriteError:%s\n”,strerror(errno));

  exit(1);

  }

  memset(response_buf,0,sizeof(response_buf));

  memset(response_content_buf,0,sizeof(response_content_buf));

  }while(read_count!=0);fclose(fp);

  为了能对多个浏览器同时进行办事,该Web办事器还增加了多线程的机制。每当一个浏览器与之建立连接时,Web办事器会产生一个线程为其进行办事,确保了办事的及时性。多线程的代码以下所示:

  pthread_ta_thread;

  void*thread_result=NULL;

  pthread_create(&a_thread,NULL,server_thread,(void

  *)&client_socket);/*建立办事器线程*/

  全部Web办事器措置的流程如图6所示。

体系测试

  在嵌入式Linux平台下,输入号令“ifconfig”,便可获得以后装备的IP地点,如图7所示。由图可见,该装备的IPv4地点为“192.168.1.106”,IPv6地点则为“fe80::c23f:eff:fef4:394b”。

  在嵌入式Linux装备中启动Web办事器法度,并在背景运行。在浏览器中输入Web办事器的IPv4地点,即便用IPv4地点拜候Web办事器,如图8所示。获得Web办事器反应的网页如图9所示。由图9可见,Web办事器可以或许输入HTML网页和png格局的图片。在网页中输入Web办事器的IPv6地点,即用IPv6地点来拜候Web办事器,如图10所示,获得如图11所示的Web办事器反应网页。

  同时利用其他浏览器拜候Web办事器也会获得一样的呼应成果,申明本文设想的Web办事器可以或许同时支撑IPv4与IPv6地点进行拜候。

  本文完成了一个支撑IPv4与IPv6地点同时进行拜候的嵌入式Web办事器设想,但目前也仅仅实现了输入网页内容的服从,还无法对CGI脚本进行措置,并与用户进行交互。后续将不竭完美体系服从,增加对CGI脚本进行措置的服从。

  (作者单位为南通年夜学电子信息学院)

  参考文献

  [1]刘鑫.基于ARM平台的嵌入式WEB办事器的设想与实现[D].成都:电子科技年夜学,2010.

  [2]李亚娟.嵌入式Web技术利用研究[D].西安:西安电子科技年夜学,2008.

  [3]王晓峰,吴建平,崔勇.互联网IPv6过渡技术综述[J].小型微型计较机体系,2006,(03):385-395.

  [4]宋江贵.基于ARM9的嵌入式WebServer研究利用与通信实现[D].北京:北京邮电年夜学,2008.

  [5]罗亚非.基于TCP的Socket多线程通信[J].电脑知识与技术,2009,(03):563-565+598.

顶一下
(0)
0%
踩一下
(0)
0%
------分开线----------------------------
标签(Tag):IPv6 IPv4 IPv4与IPv6双和谈栈
------分开线----------------------------
颁发评论
请自发遵循互联网相关的政策法规,严禁公布色情、暴力、革命的谈吐。
评价:
神色:
考证码:点击我更换图片
猜你感兴趣