远程软件升级(http协议)

远程软件升级

第一次接触http协议软件升级方面的编程,以下是本人的学习过程,希望对读者有帮助。
需要的参考文献有:设计自动升级软件、linux下的webserver_BOA及CGIC库的使用指南
读者需要在要作为服务器的系统上安装boa服务器,根据“linux下的webserver_BOA及CGIC库的使用指南”可以成功安装完成boa服务器。服务器安装完成后,就是升级程序的编写了。升级程序的主要功能是做为客户端请求boa服务器上的升级包(升级包要放在服务器下,收到请求后在发给客户端即升级程序端)、接收升级包、关闭要升级的软件、替换/lib下的库文件、重启升级完成后的软件。
读者要做的主要工作就是升级程序的编写(客户端),下面是升级程序的实现过程:
1、建立tcp连接:
 /* 客户程序发起连接请求 */
  if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
  {
    fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
    exit(-1);
  }
连接的ip为boa服务器的ip,端口为boa服务器http协议的监听端口,一般默认是80端口,在配置boa服务器的时候可以在配置文件boa.config修改端口。
2、连接成功后,向boa服务器发送请求:
send = write(sockfd, request + totalsend, nbytes - totalsend);
request指向的请求字符串必须是http协议的请求格式,如下:
sprintf(request, "GET %s HTTP/1.1\r\nAccept: */*\r\nAccept-Language: zh-cn\r\n\
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n\
Host: %s:%d\r\nConnection: Close\r\n\r\n", host_file, host_addr, portnumber);
  printf("%s", request);/*准备request,将要发送给主机*/
3、接收boa服务器的返回数据也就是升级包了,boa服务器的返回还是http协议的数据,接收完成后需要按照http协议解析才能得到正确的升级包,解析代码如下:
while((nbytes=read(sockfd,buffer,1))==1) //接收boa服务器返回的数据
  {
    if(i < 4)  {
      if(buffer[0] == '\r' || buffer[0] == '\n')  i++;
      else i = 0;
      printf("%c", buffer[0]);/*把http头信息打印在屏幕上*/
    }
    else  {
      fwrite(buffer, 1, 1, fp);/*将http主体信息写入文件*/
      i++;
      if(i%1024 == 0)  fflush(fp);/*每1K时存盘一次*/
    }
  }
4、被升级软件的关闭、升级包的替换、升级后软件的重启如下(我的升级程序是作为被升级软件的一个子进程,所以可以用以下的方式):
 sprintf(mvlib,"mv %s /lib/",local_file);
   kill(getppid(),SIGKILL);  //kill父进程
  system(mvlib); //将升级包转移到'/lib'下
  system(argv[2]);  //重启父进程
我自己参考网上一些牛人的程序模拟了一个http协议的服务器,和软件升级的模拟,各种测试已通过,如有需要请留言。
  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值