お客さんのシステムでFTP通信で切断の際にいつもエラーが出ると言う。
どうも調べてみると、WinINet APIでFTP通信をしているようなのだが、これが曲者。
WinINet APIでのFTP通信というと、例えば公式で解説されているように、
(1)InternetOpenでインターネットハンドルを取得
(2)InternetConnectでFTPサーバへ接続
(3)FtpGetFileでファイルGET
(4)InternetCloseHandleでFTPサーバ切断
(5)InternetCloseHandleでインターネットハンドルを解放
というのが典型的な手順といわれている。
普通に考えたら、(4)のFTPサーバ切断のところで、FTPプロトコルに従って正しい手順でサーバ切断の処理(QUITリクエスト)をしてくれそうなものだが、残念ながらWinINetはそんなにお行儀がよくないようだ。(4)でWinINetがしてくれるのは、ソケットレベルでプツンと切ること。
ちなみにQUITを送らずにTCPコネクションが切断された場合、FTPサーバ側では正しい手順で切断されていないのでエラーログが吐かれてしまう。困ったものだ。。。
回避するには、(4)の前にFtpCommandでQUITを手動で送るしかないようだ。
例
HINTERNET hFtpCommand;
BOOL bRet = FtpCommand(hSession, FALSE, FTP_TRANSFER_TYPE_ASCII, "QUIT", 0, &hFtpCommand);
探したら似たようなのがあった...
[VB6]WinInetのFTPハンドルのクローズはQUITコマンドを送らない
これ以外はほとんどヒットしないようだ・・・
こんなのは大した問題ではないというのが大勢なのか?
FTPサーバのワーニングなど取るに足らないということなのか。