AndroidデバイスからC#のTCPサーバにセンサデータを送信しています。アンドロイドクライアントは32バイトの固定サイズのチャンクでデータを送信します。TCPサーバが固定サイズのメッセージを正しく読み取っていない
サーバーでは、完全なパックで提供されると予想されるデータを読み込みましたが、TCPはストリームプロトコルなので、サーバーに到着するメッセージの一部が2つに分かれています。 SocketSniffというソフトウェアで見ることができるので、私はそれを知っています。
問題は、サーバー上でどのように処理するのかわかりません。
私が見つけたすべての例は、NetworkStream.Read()
を使用しています。このメソッドでは、読み取るデータ、オフセット、読み込むバイト数を格納するためにバイトの配列を渡す必要があります。このバイト配列は、私の場合32の知っているサイズでなければなりません。
私のサーバーに届いたメッセージの実際のサイズはわかりませんが、次のいずれかの状況が考えられます。
受信したデータサイズが32バイトの場合はすべてOKです。
受信したデータサイズが32バイトより大きい場合は、データが失われていると思います。
受信データサイズが32バイト未満の場合、これらのバイトが20バイトとなり、これらのバイトが配列に格納され、配列の最後の12バイトがゼロのまま残ります。私は実際にいくつかのゼロを受け取っているかもしれないので、実際に受け取ったサイズを知る方法がないので、次の読みに来るべき残りのデータとマージすることはできません。
受信を扱う私のコードは以下の通りです:
int buffer = 32;
...
private void HandleClientComm(object client)
{
TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();
byte[] message = new byte[buffer];
int bytesRead;
while (true)
{
bytesRead = 0;
try
{
bytesRead = clientStream.Read(message, 0, message.Length);
}
catch
{
break;
}
if (bytesRead == 0)
{
// Connection closed
break;
}
SensorData sensorData = ProcessTcpPacket(message);
}
tcpClient.Close();
}
は、私がソケットで受信していたデータのサイズを知る方法はありますか?
がbytesReadあなたが希望のサイズを返しません。あなたがする必要がどのような
は別のwhileループがこれを気に入って追加しているのですか? –
タイトルに「C#」などのプレフィックスを付けないでください。それがタグのためのものです。 –
私はちょうどこの質問をすることによって非常にばかばかしいと感じました。 BytesReadは読み込んだバイト量を正確に返しましたが、私はそれを見逃す可能性がありませんでした... Thx – RBasniak