- PR -

SocketでFTPプログラムを作ったが、【Connection reset】が発生!

投稿者投稿内容
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2004-07-30 09:59
引用:

おばけさんの書き込み (2004-07-30 00:25) より:

※私は良く知りませんが、OSIって7層じゃなかったでしたっけ?


アプセトネデブ(アプリケーション、プレゼンテーション、セッション、トランスポート、ネットワーク、データリンク、物理)
の7層です 
http://www.wakasato.org/learn/nepc/course1/chapter01/section02.html

等が参考になるかと。 

_________________
Inspired Ambitious
ISMS Assistant Auditor
かつや
ベテラン
会議室デビュー日: 2004/01/19
投稿数: 70
投稿日時: 2004-07-30 10:26
通信分野のプログラミングは初めてだったので、よく分からないまま作ったのですが、
メールクライアントとかWEBクライアントなんかでも、多分、ソケットの部分でエラーが発生した場合、何度かリトライをやってるんじゃないかな?と思います。

本来、通信PGでは、ソケットエラーに対しては何度かリトライを設けるのが定石なのかもしれないですね。
なんか、そんな気がしてきました。

リトライを行ってもエラーが続いたときに始めて、エラーとしてユーザ通知するものなのかもしれないですね。まー私の勘なんですが。

今回の件に関しては、
依頼主-----------A社(インフラ担当)
    |
    -----B社(ソフト開発担当)-----C社(製造担当)------私(他3人)

となっており、環境周りに関する情報を入手するのは現実的に困難でした。
また、インフラ情報がないとプログラムが組めないのか!って話にまで発展する可能性もあり、
はたまた周囲を騒がせた挙句、原因はPGミスです。とは言い辛い状況を自分で作ってしまう結果に陥ることを考慮すると、なかなか難しいものです。
かつや
ベテラン
会議室デビュー日: 2004/01/19
投稿数: 70
投稿日時: 2004-07-30 10:34
おばけさん、
OSIは7層です。

後で読みかえして8になってたのでやっちゃったーと思ってたところ、
ご指摘いただき、赤面してます。

どうやら、雑魚クレーマーが一匹釣れたみたいですが、
問題の解決から程遠い存在なので放置でいきます。
あいつー
ベテラン
会議室デビュー日: 2004/05/20
投稿数: 89
投稿日時: 2004-07-30 10:58
あいつーです。

引用:

JavaやOSI8層はプラットフォームに依存するわけないから、書かなかったが、
クライアントもサーバも赤帽です。FTPはvsftpd。


おばけさんも指摘されていますが、JVMはOSごとに配布されているわけですから、
OSによって挙動が異なる、というのは大いにありえます。
というか、OS依存のバグというのも結構ありますよ。
ですので、なるべくOSも書いたほうが良いとは思いますが。
(今回は関係ないとは思いますが、特定OS限定のライブラリなんかもありますしね)

引用:

メールクライアントとかWEBクライアントなんかでも、多分、ソケットの部分でエラーが発生した場合、何度かリトライをやってるんじゃないかな?と思います。

本来、通信PGでは、ソケットエラーに対しては何度かリトライを設けるのが定石なのかもしれないですね。


自分もネットワーク系にはあまり詳しくないのですが、
トラフィックや通信状況の影響で失敗するというのは考えられることかとは思いますので、
リトライして、一定回数失敗したらエラーというのは定石だと思います。
(リトライ時にエラー通知するかどうかはケースバイケースだと思いますが)

ちなみにエラー時のトレースなどは取得できるのですか?
それらも場合によっては有益な情報となると思います。

後は一般的なことですが、掲示板で不快なことがあったからといって、
直ぐにそれをそれを不快感あふれる口調で返す、というのは如何なものでしょうか。
なるべく友好的に話は進めましょうよ。
# だって相手が〜というのは止めてくださいね
かつや
ベテラン
会議室デビュー日: 2004/01/19
投稿数: 70
投稿日時: 2004-07-30 11:36

あいつー氏へ

>リトライして、一定回数失敗したらエラーというのは定石だと思います。

うん。私も定石のような気がしてきてます。
http://e-words.jp/w/E382B3E383AAE382B8E383A7E383B3.html
上の記事を読む限り、コリジョンはエラーではないとなってます。
でも、データ再送は、OSもしくはNIC、ルータの役割だと思うのだが、
アプリで制御するものなのかな?
そのあたり、ソケット詳しい人教えてください。

>ちなみにエラー時のトレースなどは取得できるのですか?

Exception#geMessage()
でエラー内容をログに出力してますが、
確認できる内容が【Connection reset】だけでした。
それ以外の情報はなかったです(何でエラー番号すらないのか不明)。

>後は一般的なことですが、掲示板で不快なことがあったからといって、
>直ぐにそれをそれを不快感あふれる口調で返す、というのは如何なものでしょうか。

このカテで議論する内容ではないですが、
社会人としての常識に関わる部分でもありますので、あえて言いますが、
不快感を相手に伝達することも、コミュニケーションの一つです。
掲示板であろうがなかろうが、極めて一般的なことですよ。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-07-30 11:52
引用:

上の記事を読む限り、コリジョンはエラーではないとなってます。


Ethernetでのパケット衝突に際しての再送は、物理層やデータリンク層の責務だと
思われます。Ethernet特有の出来事ですからねえ。

引用:

でも、データ再送は、OSもしくはNIC、ルータの役割だと思うのだが、
アプリで制御するものなのかな?


再送と一口に言っても、それぞれ責務が違いますよね。
NICはEthernetレベルで、ルータはIPレベルで、OSはTCPレベル?
う〜ん、私も詳しくないですが、とにかく何でもかんでもこれら下層の連中が
何とかしてくれるってわけではないでしょうね。

ただ、今回の件は、コネクションがリセットされたと言っているので、TCPの
コネクションが切れたってことかな?まあ、理由は色々とあると思いますが、
相手のFTPサーバが死んだとか、そういうことも考えられますよね。

引用:

Exception#geMessage()
でエラー内容をログに出力してますが、


エラー時にはスタックトレースを出した方が良いですよ。
厳密にどこで例外が発生しているかわかりますから。
で、もしFTPクライアントのソースコードがあるのでしたら、その例外発生
箇所のソースを追って挙動をチェックしてみても良いですよね。
まあ、JNIでOSネイティブなシステムコールや関数を呼んで終わり、というオチも
あるでしょうけど・・・。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2004-07-30 12:47
引用:

本来、通信PGでは、ソケットエラーに対しては何度かリトライを設けるのが定石なのかもしれないですね。



そんな事は無い。
TCP接続を用いる場合、プロトコルスタック内でリトライ処理etcを勝手にやってくれます。そんな事はTCPレベルで発生しているエラーに対して、リトライ処理を行っても無駄です。リトライをするならConnectからやり直しでっせ。

引用:

今回の件に関しては、
依頼主-----------A社(インフラ担当)
    |
    -----B社(ソフト開発担当)-----C社(製造担当)------私(他3人)

となっており、環境周りに関する情報を入手するのは現実的に困難でした。
また、インフラ情報がないとプログラムが組めないのか!って話にまで発展する可能性もあり、
はたまた周囲を騒がせた挙句、原因はPGミスです。とは言い辛い状況を自分で作ってしまう結果に陥ることを考慮すると、なかなか難しいものです。



だったら実環境に出来るだけ近い環境を用意して、自前で試験するしかないんじゃないの?私なら「正常に機能しているか、稼働状況の確認のためログファイルと照らし合わせたい」とか言って貰って来ますけどね。

#IP Networkな話題のような気がするんだけど。
かつや
ベテラン
会議室デビュー日: 2004/01/19
投稿数: 70
投稿日時: 2004-07-30 13:21
甕星氏へ

引用;--------------------------------------------------------------------------
そんな事は無い。
TCP接続を用いる場合、プロトコルスタック内でリトライ処理etcを勝手にやってくれます。そんな事はTCPレベルで発生しているエラーに対して、リトライ処理を行っても無駄です。リトライをするならConnectからやり直しでっせ。
-------------------------------------------------------------------------------

なるほど。TCPレベルのエラーではコネクトからやりなおしですか。
一つ質問ですが、では、アプリで検知するエラー(具体的には、FTPコマンドの”NLST”とか”RETR”を制御用ソケットから投げて異常終了。サーバからの戻り値確認不可)は、TCPレベルのエラーということでいいでしょうか?
となると、プログラムが悪いってことですね。
でも不明なのは、制御用の接続がリセットされたのか、転送用のコネクションがリセットされたのかがわからないです。
これって、判別する手法とかってあるのでしょうか?

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