ljmmail 发表于 2007-04-20 08:23

informix 408 错误

一个程序需要从远程主机下载数据在执行
ftp_getfile ( &ftpinfo, rFile, lFile);
之后在执行
select*into:khfromdfkh   wherewbh=:dw.wbh and xh=:kh.xh;
就会导致 408 错误,
但是如果 ftp_getfile () 远程下载函数执行失败的时候,程序就可以顺利的执行下去,请有经验的高手予以指导, 谢谢!!!
<code>

errno = getfile(sh.sip, rHostUser, sh.pas,remoteFile, localFile, msg);

if(errno)get_Wkey(18, 40, 1, "%s 错误 %d", msg, errno);

// strcpy(localFile, "lkin/ndh008024_0415.410526108070415001");
if((in = fopen(localFile, "r")) == NULL){
    get_Wkey(18, 40, 2, " 开户文件 %s 无法打开 ", localFile);
    return 2;
}


flen = strlen(localFile);
if( flen > 3)strcpy(pxh,localFile + flen - 3);
elsestrcpy(pxh, "999");

sprintf(tStr, "tmp/kh%s%s_%s.err", dw.wbh, pxh, stim+4);
if((fer = fopen(tStr, "w")) == NULL){
    get_Wkey(18, 40, 1, "开户错误结果文件 %s 无法生成", tStr);
    return 3;
}
fprintf(fer, "\n\n%10s{%s}dsnd 自动开户错误数据.\n", "", sh.sh1);
fputs("    用户编号       绿卡帐号 户      名 绿卡余额\n", fer);



sprintf(remoteFile, "tmp/KH%s%s_%s",dw.wbh, pxh, stim+4 );
if((of = fopen(remoteFile, "w")) == NULL){
    get_Wkey(18, 40, 1, "批量开户分析表 %s 无法生成", remoteFile);
    return 4;
};
fprintf(of, "%12s%s%s批量开户记录\n", "", dw.wnm, pxh);
fprintf(of, "序 号    用户编号户      名变压器帐   号开户额电费额绿卡户名\n");

// fgets(fbuf, sizeof(fbuf), in);
// 读出成功开户数据中的汇总纪录, 这些纪录不需要进行处理

while(fgets(fbuf, sizeof(fbuf), in)){
    /*
    序号(8)帐号(19) 户名(22) 客户号(14) 证件类型(2) 证件号码(18)
    交易金额(12) 存款余额(16) 业务手续费(12) 应答码(1) 错误信息(30)

    主要是根据用户的顺序号来确定用户编号, 然后将绿卡开户帐号信息加载到
    dfmx 数据库中, 然后可以在本程序中增加数据校对功能.
    4809|605062104200099895 |                   |李水利                |000000000000000000|       10.00|       10.00|    0.00|成功                        |
    */
   
    if(fbuf != '|') continue;

    if(strncmp(fbuf+128, "成功", 4) != 0   ) {
      fputs(fbuf, fer);
      continue;
    }
      
    SplitText(fbuf, '|', "%8l %19s %* %s %* %12d %12d %* %8s",
      &khxh, lkzh, lknm, &fse, &jce, ders);
   
    kh.xh = khxh;

    $select * into :kh from dfkh where wbh=:dw.wbh and xh=:kh.xh;

   fprintf(fer, "[%s] [%5ld] [%19s] [%s] [%12.2f] [%12.2f] SQLCODE=[%ld]\n",
       dw.wbh, kh.xh, lkzh, lknm, fse, jce, SQLCODE);
    // 对开户非成功数据的处理.

    if(++ tb.hu4 % 100 == 0) Mprintw(12, 20, "正处理:%20.20s", fbuf);

   if(SQLCODE) {
      fprintf(fer, "无开户(SQLCODE=%ld) [%s] %s", SQLCODE, sqlca.sqlerrm, fbuf);
      tb.hu3 ++, tb.je13 += fse;
    }
    else {
      $select * into :mxfrom dfmx where wbh = :dw.wbh and mkh = :kh.mkh;

      mx.khe = fse;
      mx.jce = jce;
      strcpy(mx.mzh,lkzh);

      // 对于所有在本菜单中读到的批量开户数据,程序自动为这些帐户设置需
      // 进行加办的标志。

      $updatedfmx set(mzh, khe, jce, mbz) =
      (:mx.mzh, :mx.khe, :mx.jce, '0')
      where wbh=:dw.wbh and mkh=:kh.mkh;
      tb.hu1 ++, tb.je11 += mx.jce, tb.je12 += mx.dfe;

      fprintf(of, "%5ld%16s%12s%6ld%9.9s%6.2f%6.2f%12.12s\n",
      kh.xh, mx.mkh, mx.mnm, mx.byq, mx.mzh+9, mx.khe, mx.dfe, lknm);
      if(tb.hu1 % 5== 0) fputs("\n", of);
    }
}

<\code>

ljmmail 发表于 2007-04-20 20:56

经过对该应用程序的认真分析, 发现该错误是由 sco libftp.a 函数库的漏洞引起的,在不使用 libftp 之类函数的时候,就可以解决以上的错误现象,最好直接引用 系统 ftp 程序执行以上功能即可,即使使用 system 操作也可以。
页: [1]
查看完整版本: informix 408 错误