私はサーバとクライアントとの簡単なtcp/ipチャットプログラムを持っています。最初にパケットを送信すると、クライアントに送信されますが、NetworkStream.Readの実行中は実行が停止され、例外はスローされません。私が送る次のパケットは完全に読み込まれ、処理されます。私が気付いた別の奇妙なことは、サーバーから情報を取得してもデバッグシンボルを置いてスキップする必要がある場合でも、MyNetworkStream.DataAvailableは常にfalseであることです。私はすべてのコードを投稿することができればいいと思っていますが、それは長いので、私はネットワークストリームに読み書きする場所に投稿します。NetworkStream.Readが最初に動作しません
public void Listen(int byteLength)
{
var buffer = new byte[byteLength];
MySocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Read), buffer);
}
private void Read(IAsyncResult ar)
{
while (MySocket.Connected)
{
MyNetworkStream = new NetworkStream(MySocket);
var buffer = new byte[((byte[])ar.AsyncState).Length];
if (!MyNetworkStream.DataAvailable)
throw new Exception("Data not available");
MyNetworkStream.Read(buffer, 0, buffer.Length); <------Here it stops execution without throwing an exception
string content = Encoding.ASCII.GetString(buffer);
if(OnRead == null)
continue;
var e = new CommandEventArgs(null, content);
Control target = null;
if (OnRead.Target is Control)
target = (Control)OnRead.Target;
if (target != null && target.InvokeRequired)
target.Invoke(OnRead, this, e);
else
OnRead(this,e);
}
}
public void Write(string message)
{
try
{
var buffer = Encoding.ASCII.GetBytes(message);
MySocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, null, null);
if (OnWrite != null)
{
var target = (Control)OnWrite.Target;
if (target != null && target.InvokeRequired)
{
target.Invoke(OnWrite, this, new EventArgs());
}
else
{
OnWrite(this, new EventArgs());
}
}
}
catch
{
}
}
TCPの重要な点の1つは、パケットとしてではなくストリームとしてデータを配信することです。 1回の書き込み呼び出しが到着し、複数の書き込み呼び出しが一緒に到着することがあります。 – CodesInChaos