VC++ソケット通信(FTP()でEWSのls情報を取得したい – プログラミング – Home

VC++ソケット通信(FTP()でEW...
 
通知
すべてクリア

[解決済] VC++ソケット通信(FTP()でEWSのls情報を取得したい


もも
 もも
(@もも)
ゲスト
結合: 23年前
投稿: 36
Topic starter  

こんにちは
前回の質問で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);

}
各ポートの使い方や、通信の根本的な考え方など、間違っているところがどこかにあると
思っていますが、私の職場の人では誰もわかりません。
どなたかご存知の方がいらっしゃいましたら、教えていただけますか。

宜しくお願いします。
                                   以上です。


引用未解決
トピックタグ
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 106
 

> return_size = m_ListenSock.Receive( buff,buffsize );  ★★★
上記の return_size の値はどうなっていますか?

あと、データが「フフフフフ・・・」となるのはデータを受信する領域のゴミが
残っているだけで、データの受信自体できていないような気がします。

最後にどうしても気になった点ですが、NLSTコマンドを発行する前の
段階までは全て正常に終了しているんでしょうか?
結果の確認をする処理がないので、ちょっと聞いてみました。


返信引用
もも
 もも
(@もも)
ゲスト
結合: 23年前
投稿: 36
Topic starter  

んさん、ありがとうございます。

結局、仕事上のプログラミングだったので、その後「EWS上のls結果を取得する」
という「目的」だけを最優先するようプログラムを変更し作業をいたしました。
(CFtpConnectionクラスを使用してFTPコネクションを確立し、CFileFindクラス
 を使用し、相手FTPサーバのファイル一覧を取得するようにしました)

そして現在も仕事に終われ(言い訳ですが)この件については解決していません。
せっかくお返事を頂いたのに済みませんでした。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました