2011-12-06 16 views
2

は、私は2つのNetworkStreamsオブジェクトを作成したいと私は1つだけ操作のみ操作を足す他のものを読んでをサポートする必要があることを望みます。これは私がしようとしたものですが、私は、私はCanReadとCanWriteは読み取り専用プロパティであることをエラーを得たエラーC#でNetworkStreamオブジェクトのCanReadとCanWriteのプロパティを設定することはできますか?

NetworkStream nStreamObj1 = new NetworkStream(clientSocket); 
    NetworkStream nStreamObj2 = new NetworkStream(clientSocket); 

    nStreamObj1.canRead = true; 
    nStreamObj1.canWrite = false 

    nStreamObj1.canRead = false; 
    nStreamObj1.canWrite = true; 

を持って!これらのプロパティを可能な限り設定するにはどうすればよいですか?

答えて

3

読み書きできるソケットと仮定すると、あなたは試すことができ、次の

NetworkStream nStreamObj1 = new NetworkStream(clientSocket, FileAccess.Read); 
NetworkStream nStreamObj2 = new NetworkStream(clientSocket, FileAccess.Write); 

編集:

備考セクションhere

+0

:だから

public class ReadOrWriteStream:Stream { private readonly Stream srcStream; private readonly bool canRead; private readonly bool canWrite; private bool disposed; public ReadOrWriteStream(Stream srcStream, bool canRead, bool canWrite) { this.disposed = false; this.srcStream = srcStream; this.canRead = canRead; this.canWrite = canWrite; } public override void Flush() { srcStream.Flush(); } public override long Seek(long offset, SeekOrigin origin) { return srcStream.Seek(offset, origin); } public override void SetLength(long value) { if (!CanWrite) throw new NotSupportedException(); srcStream.SetLength(value); } public override int Read(byte[] buffer, int offset, int count) { if(!CanRead) throw new NotSupportedException(); return srcStream.Read(buffer, offset, count); } public override void Write(byte[] buffer, int offset, int count) { if(!CanWrite) throw new NotSupportedException(); srcStream.Write(buffer, offset, count); } public override bool CanRead { get { return srcStream.CanRead && canRead; } } public override bool CanSeek { get { return srcStream.CanSeek; } } public override bool CanWrite { get { return srcStream.CanWrite && canWrite; } } public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { if(!CanRead) throw new NotSupportedException(); return srcStream.BeginRead(buffer, offset, count, callback, state); } public override int EndRead(IAsyncResult asyncResult) { return srcStream.EndRead(asyncResult); } public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { if (!CanWrite) throw new NotSupportedException(); return srcStream.BeginWrite(buffer, offset, count, callback, state); } public override void EndWrite(IAsyncResult asyncResult) { srcStream.EndWrite(asyncResult); } public override long Length { get { return srcStream.Length; } } public override long Position { get { return srcStream.Position; } set { srcStream.Position = value; } } protected override void Dispose(bool disposing) { if(disposing && !disposed) { srcStream.Dispose(); disposed = true; } base.Dispose(disposing); } } 

:それは次のようになりますか? – Xris

+0

@Xris:わかりません:)それは別の質問で尋ねるとよい質問かもしれません。 – leppie

0

これらの値を設定することはできません。それらは、このネットワークストリームが作成された基礎となるソケットの状態に依存します。

0

を設定するためのコンストラクタに適切なFileAccessの列挙値を指定して参照してください。 NetworkStreamの可読性と書き込み可能性CanReadプロパティは、NetworkStreamが初期化されるときに設定されます。

これらの値を直接設定することはできません。

1

あなたは(おそらくストリームがTcpClient.GetStreamへの呼び出しの結果です)NetworkStreamコンストラクタを呼び出すことができない場合は、あなたの唯一のオプションはCanRead/CanWriteプロパティをオーバーライドするラッパーの流れを作ることであろう。ソケットが読み書きできるかどうかを知る方法

var networkStream = myTcpClient.GetStream(); 
var readOnlyStream = new ReadOrWriteStream(networkStream, true, false); 
var writeOnlyStream = new ReadOrWriteStream(networkStream, false, true); 
+0

ええ!それは良いアイデアのようです!それは私がもうTcpClient.GetStream()を呼び出す必要はないということですか?言い換えれば、WriteOrReadStreamオブジェクトは、TcpClient.GetStream()のNetworkStreamオブジェクトを置き換えるものです。ありがとうございました。 – Xris

+0

いいえこれに応答するレスポンスが更新されます。 – spender

+0

ありがとうございました!私はほぼ3週間これを探していて、私は上に移動することができませんでした!乾杯! – Xris

関連する問題