- PR -

.Net C#でSolarisからFTP(ソースを訂正しました)

1
投稿者投稿内容
DAMAGE
会議室デビュー日: 2005/06/15
投稿数: 3
投稿日時: 2005-06-15 22:42
みなさまはじめまして。

少し困った現象が起きているので、相談させてください。


現在、あるシステムにて.Net C#で作成したAPLより
Solaris2.7のサーバに対してFTP接続を行い、ファイルをGETしています。

このたび、そのSolarisサーバがバージョンアップ(5.9)したところ
突然FTPによるGETが出来なくなってしまいました。
(APLからのGETが出来ないだけで、コマンドプロンプトなど手動ではGET可能)

順を追って見るとどうも下記部分でループを抜けていないようです。
Solaris2.7と5.9ではftpdの挙動が若干違うらしいのですが
原因がつかめません。何かおわかりの方がいらっしゃったらお知恵を貸してください。


private ResponseDescription ReceiveCommandResponse()
{
ResponseDescription resp_desc = new ResponseDescription();
int StatusCode = 0;
String StatusDescription = null;
bool bCompleteResponse=false;
if( m_ControlSocket == null ) {
throw new ApplicationException( "コネクションは開かれていません。" );
}
MemoryStream responseStream = new MemoryStream();
while( true ) {
int BufferSize = 256;
Byte[] recvbuffer = new Byte[ BufferSize + 1 ];
int bytesread = 0;
recvbuffer[0] = ( Byte )'\0';
bytesread = m_ControlSocket.Receive( recvbuffer, BufferSize, 0 );
//どうも↑で処理が止まっている模様
if( bytesread <= 0 ) {
break;
}
responseStream.Write( recvbuffer, 0, bytesread );
String szResponse = Encoding.ASCII.GetString( recvbuffer, 0, bytesread );

m_sbControlSocketLog.Append( szResponse );
bCompleteResponse = IsCompleteResponse( responseStream );
if( bCompleteResponse ) {
break;
}

[ メッセージ編集済み 編集者: DAMAGE 編集日時 2005-06-15 23:21 ]
DAMAGE
会議室デビュー日: 2005/06/15
投稿数: 3
投稿日時: 2005-06-16 20:53
自己レスです。

どうやら、FTPのGET自体はうまく出来ていて、下記問題部分で
「226 Transfer Complete」
というレスポンスがうまく受け取れないようです。
(逆にいうとそれまでのレスポンスはうまく受け取れています)

手動にてFTPした場合は、ちゃんと上記文言が返ってきます。

どなたかお知恵を貸してください。
rvmx
大ベテラン
会議室デビュー日: 2002/09/26
投稿数: 184
お住まい・勤務地: 愛媛県
投稿日時: 2005-06-16 22:20
今日は

症状を見ると、この前のコマンドが適切に出されていないような気がします。(RETR等、サーバーのResponceに適切な応答をしていないような気がします)
Sockの同期処理でControlチャンネルの通信をしているみたいですが、Receiveで止まるという事は、適切なコマンド送られていないと思います。
リストを見るとSoketのlogもとられて居るみたいですので、そのlogで直前までの流れを確認してみら良いと思います。
ちなみに同期処理でlockするのがいやなら、AvailableでReceiveできるか確認し、Timeoutなどを設けてエラーを出せば良いと思います。
DAMAGE
会議室デビュー日: 2005/06/15
投稿数: 3
投稿日時: 2005-06-16 23:27
お返事ありがとうございます。

ご指摘の通り、ためしにm_ControlSocket.Availableを拾ってみたところ
案の定"0"でした。

しかし、直前のレスポンスでもSocketのAvailableが"0"の個所があり
そちらはなぜかブロックされずにうまく処理されています。

Availableが"0"にもかかわらずReceiveできるなんて事はありえるのでしょうか?
rvmx
大ベテラン
会議室デビュー日: 2002/09/26
投稿数: 184
お住まい・勤務地: 愛媛県
投稿日時: 2005-06-17 04:46
今日は

試してませんが、Blockingはどうなっていますか?。
falseの時は Availableが"0"でもReceiveでブロックしないとなって今が。

それから、FTPサーバーのバージョンを変更してからの現象と言う事であれば明らかに
FTPサーバーより以前と違ったAnswerを返していると思いますが、パケットモニータなどで確認した方が良いと思います。FTPサーバーは人間向けのメーセージもよく返して来ますので。
1

スキルアップ/キャリアアップ(JOB@IT)