indy的ftp控件idftp也有bug

公司里有一个服务使用ftp方式做数据传输,于是在服务程序中使用indy的ftp控件做数据传输,一段时间的运行发现在传输过程中由于某种不知道原因情况下的网络掉线会导致程序会死翘翘,仔细分析了程序的逻辑,没有发现问题,根据记录下的日志文件,发现死翘翘前在做ftp文件传输处理,但是对其的try except end异常保护块没有记录下异常,遂开始怀疑使用的idftp控件问题,因为以前使用idTCPClient的时侯也碰到过问题。

使用google搜索关键字idftp bug 发现 http://groups.google.com.hk/group/borland.public.delphi.internet.winsock/browse_thread/thread/7b65058aa344137f/070b497000a0ea46?fwc=1 有讲到这个问题,是由于idftp在数据端口传输数据时忘记了设置连接的ReadTimeout 属性值造成。

原文作者在 interalGet函数中打了一下补丁,不过分析了一下,发现原文作者只打了interalGet中的主动传输方式部分代码,被动(passive)传输方式以及interalPut函数中也存在同样问题的代码没有打补丁。
仔细看了一下代码,发现只要给InitDataChannel函数打下补丁就可,他在interalGet和interalPut函数中的主被动方式中都有使用。

  1. procedure TIdFTP.InitDataChannel;
  2. begin
  3.   FDataChannel.SendBufferSize := SendBufferSize;
  4.   FDataChannel.RecvBufferSize := RecvBufferSize;
  5.   FDataChannel.OnWork := OnWork;
  6.   FDataChannel.OnWorkBegin := OnWorkBegin;
  7.   FDataChannel.OnWorkEnd := OnWorkEnd;
  8.  
  9.   // 添加的代码行 added line to fix the readtimeout bug
  10.   FDataChannel.ReadTimeout := Self.ReadTimeOut;
  11. end;

———–
到此程序的分析修改就告一段落了,接下来就要让程序24×7不停的运行,以观察看是否还是否有类似问题发生了。

Popularity: 3% [?]

Related

在Delphi中使用indy SMTP发送gmail邮件

在Delphi中发送email很简单,发送ssl方式的gmail邮件也很简单,只要在使用的idSMTP上附加一个TIdSSLIOHandlerSocket 就可以了。
使用控件

  1. procedure sendMail(sToMail, sSubject, sContent: String);
  2. var
  3.     SMTP: TIdSMTP;
  4.     MailMessage: TIdMessage;
  5.     SSLSocket: TIdSSLIOHandlerSocket;
  6. begin
  7.   SMTP        := TIdSMTP.Create(nil);
  8.   SSLSocket := TIdSSLIOHandlerSocket.Create(nil);
  9.   MailMessage:= TIdMessage.Create(nil);
  10.  
  11.   SMTP.IOHandler := SSLSocket;
  12.   SMTP.Port   := 465;
  13.   SMTP.Host := 'smtp.gmail.com';
  14.   SMTP.AuthenticationType  := atLogin;
  15.  
  16.   smtp.UserName     := 'SunnyYu2000';
  17.   smtp.Password      := 'xxxxxx';
  18.  
  19.   // 设置邮件的信息
  20.   MailMessage.From.Address := 'SunnyYu2000@gmail.com';
  21.   MailMessage.Recipients.EMailAddresses := sToMail;
  22.   MailMessage.Subject := sSubject;  
  23.   MailMessage.Body.Text := sContent;
  24.  
  25.   //发送邮件
  26.   try
  27.     try
  28.       SMTP.Connect(1000);
  29.       SMTP.Send(MailMessage);
  30.       ShowMessage('发送成功');
  31.     except on E:Exception do
  32.       ShowMessage('发送失败: ' + E.Message);
  33.     end;
  34.   finally
  35.     if SMTP.Connected then
  36.       SMTP.Disconnect;
  37.   end;
  38.  
  39.   MailMessage.Free;
  40.   SSLSocket.Free;
  41.   SMTP.Free;
  42. end;

编译后需要SSL动态库支持,支持库可以到Indy网站上下载到。
如果需要发送附件,可以再发送前添加如下类似代码

  1.    // 添加邮件的附件
  2.    TIdAttachment.Create(MailMessage.MessageParts, sAttachmentFileName);

————–
Indy需要的SSL支持dll下载地址 http://www.indyproject.org/Sockets/SSL.EN.aspx

Popularity: 8% [?]

Related

一个并行压缩的工具zipmt

随着数据的积累,被备份的文件也越来越大,通常都是采用linux自带的压缩工具进行压缩备份。今天发现一个并行压缩的工具zipmt,可以充分利用机器上的cpu来并行压缩,减少压缩时间。
压缩方法

Usage:
  zipmt [OPTION...]  - muti threaded bzip2 compression utility

   - The name of the file to compress or just use “-” to indicate
        stdandard input.

Help Options:
  -?, –help        Show help options

Application Options:
  -t, –threads     The number of threads to use.
  -v, –verbose     Show Progress
  -o, –outfile     The name of an output file to write to
  -c, –stdout      Write data to standard out
  -s, –stream      Compress using the stream method

压缩时主要注意要用 -t n选项指定用来并行压缩的线程数量(一般和机器上安装的cpu数量对应),根据这个参数的设定以及机器实际的cpu数量,一般压缩时间会缩短到约为原先的 1/n 时间。

解压方式
zipmt不提供解压功能,需要用 bunzip2 来解压。

Popularity: 7% [?]

Random Posts

编译安装fastcgi++库

fastcgipp官方网站下载最新的fastcgi++-2.0alpha-81f89e4e.tar.bz2,

  1. tar -xjvf fastcgi++-2.0alpha-81f89e4e.tar.bz2
  2. cd fastcgi++-2.0alpha-81f89e4e
  3. ./configure
  4. ./make
  5. ./make install

该fastcgi++库完全使用c++编写,依赖boost库(要求>1.35),所以安装时需要先安装boost库。
编译过程中碰到问题 mysql_set_character_set 找不到问题,修改 src/mysql.cpp 文件,将如下两行注释掉

  1.         //if(mysql_set_character_set(&connection, charset))
  2.         //      throw Error(&connection);

再次编译通过。
安装后include头文件被拷贝到 /usr/local/include/fastcgi++/,库文件被拷贝到 /usr/local/lib/fastcgipp.a

编译examples目录下测试用的fastcgi应用,验证编译安装的正常性。
使用默认的 make examples 没有编译通过。打开Makefile文件,发现缺少对 boost库的引用,将其添加上,再次编译,通过。

  1. FASTCGIPP_INCLUDE=/usr/local/include/fastcgi++
  2. BOOST_INCLUDE=/usr/local/include/boost-1_39
  3. BOOST_CPPFLAG=-I$(BOOST_INCLUDE) -pthread
  4. BOOST_THREADLIB=-lboost_thread-gcc34-mt-1_39 -pthread
  5.  
  6. pkgConfigLibs=-lfastcgipp -lboost_thread -lmysqlclient
  7. CXX=g++
  8. CXXFLAG= -g -O2
  9.  
  10. database.fcgi: database.cpp
  11.         $(CXX) -o database.fcgi database.cpp -I$(FASTCGIPP_INCLUDE) $(pkgConfigLibs) $(BOOST_CPPFLAGS) $
  12. (CXXFLAGS) $(BOOST_THREAD_LIBS)
  13.  
  14. clean:
  15.         rm -f *.fcgi

—————-
默认Makefile编译不通过的原因
1. 缺少对boost库的目录include引用
2. 缺少boost线程库的应用,默认使用的是-lboost_thread 需要为-lboost_thread-gcc34-mt-1_39 -pthread

Popularity: 9% [?]

Random Posts

编译安装BOOST库

boost官方网站上下载最新的1.39版boost库。

  1. tar -xjvf boost_1_39_0.tar.bz2
  2. cd boost_1_39_0
  3. ./bootstrap.sh
  4. ./bjam -install

耐性等待编译安装,偶等了2个多小时。boost库的include头文件会被安装到 /usr/local/include/boost-1_39 下。库文件会被安装到 /usr/lib 目录下。

编译简单的测试程序。

  1. #include <boost/lexical_cast.hpp>
  2. #include <iostream>
  3. int main()
  4. {
  5.    using boost::lexical_cast;
  6.     int a = lexical_cast<int>("123456");
  7.     double b = lexical_cast<double>("123.456");
  8.     std::cout<<a<<std::endl;
  9.     std::cout<<b<<std::endl;
  10.     return 0;
  11. }

编写一个简单的Makefile文件

  1. BOOST_INCLUDE=/usr/local/include/boost-1.39
  2. BOOST_ROOT=/usr/local/src/boost_1_39_0
  3. BOOST_LIB=/usr/local/lib
  4.  
  5. CXX=g++
  6.  
  7. test: test.cpp
  8.         $(CXX) -o test test.cpp -I$(BOOST_INCLUDE)
  9. clean:
  10.         rm -rf test

进行编译

  1. make test

执行test程序可以看到输出结果.

123456
123.456

boost库安装确认通过。
————–
编译时可能需要导入的一些库引用

  1. #使用regex
  2. -lboost_regex-gcc
  3. #使用thread
  4. -lboost_thread -pthread

Popularity: 8% [?]

Random Posts

nginx中的多条件rewrite解决方案

前两天在搞 nginx 的rewrite, 其中有个地址需要用到多条件判断,结果试了好久,没有办法在nginx中写出复合方式的条件判断,比如

if ($request_method !~ ^post$ && $request_filename !~ ^/file/a.* ) {
rewrite …
}

网上参照了一篇,可以通过nginx的set命令,来设置变量进行前置判断,从而达到多条件的rewrite实现。

# 先定义两变量备用
set $my_file ”;
set $my_uri $request_uri;

if ($request_method = POST) {
set $my_uri ”;
}

# 使用友好的地址方式
if ($query_string) {
set $my_uri ”;
}


# 判断$my_uri是否为空,不为空,则设置要rewrite到的文件,再在下面用rewrite转
if ($my_uri ~ ^(.+)$) {
set $my_file /cache/myfile/$http_host/$1index.html;
}

if (-f $document_root$my_file) {
rewrite ^(.*)$ $my_file break;
}

将名为$my_uri的变量作为标志位,如果不满足一些前置条件时,将标志位置空;
在最后只要判断标志位是否为空,如果不为空,再进行rewrite

Popularity: 13% [?]

Related

使用tar对一个目录下的某些文件做排除打包

使用tar打包时,有时候不希望将整个目录都打包进去,需要对某些文件或目录做排除

  1. tar cvfz backup.tar.gz site/* –exclude site/attach –exclude site/images

将site目录打包,但是排除其中attach和images目录,–exclude采用patten方式做匹配排除。

——
有尝试将 tar 已经打好包的文件用 –delete 删除一些,结果每次执行 都会提示 已放弃,检查tar包中的文件,未有被删除, 有知道什么原因的朋友可以告知一下。

Popularity: 13% [?]

Random Posts

被ftp连接的端口问题搞了好长时间

公司对移动做的彩信接口采用ftp做传输协议,程序写好后在实际连接调试时,发现怎么样都是连接服务器获取数据保存数据有问题,开始确实是服务器方有问题(通过标准的ftp客户端连接也不正常),但是在联系对方解决后,自己这端程序仍然是无法正常工作(这个时候ftp客户端连接正常)。
于是检查自己这边服务器上防火墙的配置情况,连接到对方的ftp的ip和端口是开放的,再检查自己的程序,无果。
突然想起 ftp 传输除了公开的端口外还有另外一个端口要使用(无论主动方式还是被动方式,都是),由于这个涉及到对方防火墙的设置,为了减少麻烦,直接将自己这边对对方接口服务器的ip和端口的限制改为对ip的限制,重新应用防火墙,再次运行程序,一切ok。

——–
以后涉及到ftp的应用防火墙配置的应用,一定要牢牢记住ftp服务双端口的问题,要不白浪费时间找问题啊

Popularity: 11% [?]

Random Posts

网关发送彩信Nokia手机不能显示出smil文件内容问题解决

使用自己写的ParlayX2.0接口发送发送联通的MMS彩信,几个测试的手机除了Nokia手机接收时不能显示出smil文件内容(提示要通过 对象 菜单查看彩信附件内容)其他都基本都接收显示正常,网上查找了一些资料,说是对某些手机发送数据包时要添加附件的头信息 Content-Location 值,补上发送,仍然不行,联系厂商 华为,抓了一个实际通信的数据包,对比发现我程序中发送的数据包中对附件的 Content-Type 头信息中缺少 name 的值指定,修改一下程序,在Content-Type头信息中添加上该值信息,再次发送,手机能够正常显示smil文件内容。

补一下发送的附件头信息

Content-Type:text/plain;charset=”UTF-8″;name=”0_0.txt”
Content-ID:<0_0.txt>
Content-Location:0_0.txt

Popularity: 13% [?]

Random Posts

修改trac的wiki上传附件大小

trac默认的附件大小太小了,需要增加一下大小。修改配置文件 trac.ini

[attachment]
max_size = 262144

将max_size 设置为自己期望的大小。

Popularity: 12% [?]

Random Posts

Next Page →