WinINetはお行儀が悪い

お客さんのシステムでFTP通信で切断の際にいつもエラーが出ると言う。
どうも調べてみると、WinINet APIFTP通信をしているようなのだが、これが曲者。


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サーバのワーニングなど取るに足らないということなのか。