2012-01-24 18 views
1

ソケットからネットワークストリームを読み取ろうとしています。ソケットのAddressファミリはInterNetwork、ソケットタイプはStream、プロトコルタイプはIPです。ソケットからネットワークストリームを読み取る

私は、IPアドレスと私が読もうとしているポートからなるIPEndPointを持っています。

NetworkStream myNetworkStream; 
Socket socket; 
IPEndPoint maxPort = new IPEndPoint(IPAddress.Parse("x.x.x.x"), xxxx); 

socket = 
    new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
socket.Connect(maxPort); 

myNetworkStream = new NetworkStream(socket); 

while (myNetworkStream.DataAvailable == false) 
{ 
    Thread.Sleep(1); 
} 

byte[] buffer = new byte[1024]; 
int offset = 0; 
int count = 1024; 

myNetworkStream.Read(buffer, offset, count); 

Console.ReadLine(); 

私はデータが利用可能であることを知っている(私は、既存のアプリケーションの私の独自のバージョンを書いていますし、参照としてソースコードを使用しています)が、真/偽のデータ利用可能のプロパティは常にfalseのままで、私は私を打つことはありませんConsole.Readline()。

私はここで間違っていますか?

+0

ここにドキュメントがあります:http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.dataavailable.aspxはdo ... whileループを使用します。コードの構造は、DataAvailableプロパティをチェックする前にRead()を試す必要があることを示しています。私は100%確信していませんが、それは明示されていません。最終的なRead()の結果を調べて、返されたデータがあるかどうかを調べるのが好きです。もちろん、私は基本から離れているかもしれません。私はこの問題を経験したことがないので、これは推測です(これはコメントであり、答えではありません) – David

+0

ありがとう、それは読んでいますが、それ以上は行っていませんが、私はこれについて私の頭を浮かべることが本当に大好きなので、ドキュメントに掘り下げていきます。それはいくつかの素晴らしい開発者が以下の答えを掲示しない限りです! – JMK

答えて

2

シンプルなサーバーアプリケーションを作成し、クライアントコードをテストしました。それはすべて私のためにうまくいく。私はあなたがクライアントにデータを送信していることを二重チェックするためにサーバーコードを調べることをお勧めします。また、WireSharkなどのパケットスニッファツールを使用して、データが送信されていることを確認することもできます。

は、ここに私のサーバーのコードです:

IPEndPoint maxPort = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234); 
TcpListener listener = new TcpListener(maxPort); 
listener.Start(); 
Socket socket = listener.AcceptSocket(); 
socket.Send(new byte[] { 1, 2, 3, 4, 5 }); 
socket.Close(); 

サーバーがデータを返している場合は、TCPヘッダをチェックすることもできます。この問題は、PSHビットが設定されていないことが原因である可能性があります。これにより、TCPスタックはデータがまだ利用可能であることを通知しなくなります。私はあなたがReadコールが返ってこないと言って、DataAvailableが偽り続けて返ってくるという事実からこれを考えています。

これが役に立ちます。

+1

ありがとう、私はデバイスにログインしていなかったので私は応答を得ていなかったことが判明!ドー! – JMK

関連する問題