- - PR -
NetworkStreamはどんなネットワーク通信に適合しますか?
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-06-08 19:02
お世話になります。
Clinet側は.NETのNetworkStreamを使って、純粋のBSDソケットAPIを使うServerと通信を試みました。BeginReadを使い、非同期受信を行っています。 ここで質問ですが、 1.Client/Server間の通信Layerの対応関係に問題がありませんか? 2.DataAvailable フラグがうまく設定されていないようで、受信Dataがあるのに「false」に設定されたりします。 3.NetworkStreamを生成する際、Socketを指定するが、所有権の指定はなくても、何か不都合が生じるでしょうか?(自分でSocketをCloseする) 以上、宜しくお願いします。 | ||||||||||||
|
投稿日時: 2006-06-08 19:53
ストリーム指向の接続なら問題ないでしょう。 そうでない場合は合わないかも知れません。
DataAvailable はバッファにデータが溜まっているかどうかを表す値だったと思います。。 バッファから読み込んだ直後に確認しても、相手先から送信されてきたデータがバッファにまだ格納されていなければ False になるでしょう。
確実に Close できるのなら別に良いんじゃないですか? そのために選択肢を用意してるんだし。 | ||||||||||||
|
投稿日時: 2006-06-14 09:21
ご回答ありがとうございます。
一応、BeginRead()を使って、Callbackでデータ受信を待ち受けるテストプログラムを作成したのですが、下記二つの疑問があります。 @TCP/IPをコネクションを確立した後、Callbackで「0」バイトを受信した場合、相手はソケットをCloseしたと見なして問題がありませんか?Webでは、「0」バイト受信で、ソケットをCloseされたと見なす説もありますが、MSのマニュアルでは明記していません。 A自分のCallback処理では、受信データ長をEndReadで受け取り、再度BeginReadで受信待ちうけをさせる形にしているが、相手側はソケットをCloseする場合、「0」バイトのCallback処理がずっと繰り返されています。この現象から見て、やはり「0」バイト受信はソケットがCloseされた証と見なしてよいかと思いますが、いかかでしょうか? 以上、宜しくお願いします。 | ||||||||||||
|
投稿日時: 2006-06-14 10:39
いいえ。一般論としてはNGです。 ただし、ソケットの上に乗せるプロトコルによってはOKな場合もあるでしょう。
ホントに? 一般論としては受け入れ難いですが、どういう場合に成り立つんでしょう?
先にも書きましたが、一般論としてはNGです。 送信側はソケット接続をきちんと gracefull shutdown しているでしょうか? | ||||||||||||
|
投稿日時: 2006-06-14 13:35
System.Net.Socket#Selectメソッドに以下の説明がされていますが、これって関係あります?
| ||||||||||||
|
投稿日時: 2006-06-15 09:29
ご回答を頂き、ありがとうございます。 自分の本音は渋木宏明(ひどり)さん同様ですが、かずくんさんのみつけた上記の記述はSocketAPIのSelectにある内容だと思います。 ただ、NetworkStream自体はSocketの上位にあると認識しており、動作的にはSocketそのものに同等かどうかは自分はあまり分かりませんので、何方情報を持っているなら、是非教えて頂きたいです。 | ||||||||||||
|
投稿日時: 2006-06-15 10:26
これは Select した時ですよね。 NetwaorkStream は非同期 I/O を Select で実装しているはずはない(WinSock が非同期 I/O をサポートしているので)と思うので、同じ挙動をとるかどうかは。。。 | ||||||||||||
|
投稿日時: 2006-06-15 12:26
受信データが0バイトであること「だけ」でソケットが Close されているとみなすのは良くないと思いますが、Recieve() 結果が0バイトだった時、Socket.Connected の値を調べてみてはどうでしょう? |