こんにちは
前回の質問でAPIで基礎を学びなおすと言っておきながら、
業務上やむをえず、まだMFCでソケット通信プログラムを作成しています。
今回お聞きしたいのは、「ソケット通信でFTPのやりとりを元に、EWS上のlsの結果を
PC上で表示するには、どうすれば良いの?」という事です。
ソケットクラスは無事作成できて、EWSに21版ポートを使用して接続するところまでは
上手くいきました。ところがソケット通信の書物などを見ると、21番ポートは単にFTP
コマンドの送信用のポートであるということがわかり、20番ポートも接続しなければ
いけないということがわかりました。
ですので、21番ポートはCSock.ConnectSockを使用して接続し、20番ポートはCSock.
ListenSockを使用して接続しました。
ところが、以下のソースのように、21番ポートでFTPコマンドを送信しても、何か不正な
データを取得しているようで、表示上は「フフフフ・・」となってしまいます。
★★★の行をListenSock.Receiveではなく、ConnectSock.Receiveに変更すると、
FTPサーバーからのメッセージを見ることができ、それによるとFTPコマンドのUSERと
PASSWDとTYPE Aまでは上手くいっているようです。
----------------------------<以下ソース>-----------------------------
// ダイアログクラス/接続ボタンが押された場合の処理
void CLsDlg::OnConnectbtn()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CString CHostName; // 接続先ホストネーム
int buff; // 送信データサイズ
// ダイアログのコントロール(ComboBox)から接続先ホスト名を取る
UpdateData(TRUE);
m_HostName.GetWindowText( CHostName );
// EWSとFTPコマンド送信ポートをソケット接続
m_ConnectSock.Create();
m_ConnectSock.Connect( CHostName, 21 );
// EWSとFTPデータ受信ポートをソケット接続
m_ListenSock.Create( 20 );
m_ListenSock.Listen();
// 送信「ls」
CString SendData;
SendData = USER momo\n; // FTPサーバにユーザ名momoでログイン
buff = SendData.GetLength();
m_ConnectSock.Send((LPCSTR)SendData, buff);
SendData = PASS momo\n; // FTPサーバにパスワードmomoでログイン
buff = SendData.GetLength();
m_ConnectSock.Send((LPCSTR)SendData, buff);
SendData = CWD /usr4/momo\n; // /usr4/momoディレクトリに移動
buff = SendData.GetLength();
m_ConnectSock.Send((LPCSTR)SendData, buff);
SendData = TYPE A\n; // DATA転送MODEをASCIIモードに変更(EUC->SJIS)
buff = SendData.GetLength();
m_ConnectSock.Send((LPCSTR)SendData, buff);
SendData = NLST\n; // lsだと思うんですけど・・・・・。
buff = SendData.GetLength();
m_ConnectSock.Send((LPCSTR)SendData, buff);
}
void CLsDlg::OnReceive() // ダイアログクラス/EWSからDATA受信した時の処理
{
int return_size;
char buff[1024];
int buffsize=1024;
CString Message;
return_size = m_ListenSock.Receive( buff,buffsize ); ★★★
buff[return_size]=NULL;
Message = buff;
UpdateData(TRUE);
m_Log.InsertString( 0, Message ); // DIALOGのListBoxに受信したMessageを表示
UpdateData(FALSE);
}
各ポートの使い方や、通信の根本的な考え方など、間違っているところがどこかにあると
思っていますが、私の職場の人では誰もわかりません。
どなたかご存知の方がいらっしゃいましたら、教えていただけますか。
宜しくお願いします。
以上です。
> return_size = m_ListenSock.Receive( buff,buffsize ); ★★★
上記の return_size の値はどうなっていますか?
あと、データが「フフフフフ・・・」となるのはデータを受信する領域のゴミが
残っているだけで、データの受信自体できていないような気がします。
最後にどうしても気になった点ですが、NLSTコマンドを発行する前の
段階までは全て正常に終了しているんでしょうか?
結果の確認をする処理がないので、ちょっと聞いてみました。
んさん、ありがとうございます。
結局、仕事上のプログラミングだったので、その後「EWS上のls結果を取得する」
という「目的」だけを最優先するようプログラムを変更し作業をいたしました。
(CFtpConnectionクラスを使用してFTPコネクションを確立し、CFileFindクラス
を使用し、相手FTPサーバのファイル一覧を取得するようにしました)
そして現在も仕事に終われ(言い訳ですが)この件については解決していません。
せっかくお返事を頂いたのに済みませんでした。