나는 현재 내가 다음 (간체) 코드를 사용하여 데이터를 수신 다중 스레드 응용 프로그램에서 작동 : 나는 receivedData
가 예상되는 데이터뿐만 아니라 더 많은뿐만 아니라 포함되어 있음을 경험하고 있습니다소켓에서 수신 된 스트림이 단일 보내기 명령으로 제한됩니까?
private void BeginReceiveCallback(IAsyncResult ar)
{
bytesReceived = this.Socket.EndReceive(ar);
byte[] receivedData = new byte[bytesReceived];
Array.Copy(buffer, receivedData, bytesReceived);
long protocolLength = BitConverter.ToInt64(receivedData, 0);
string protocol = Encoding.ASCII.GetString(receivedData, 8, (int)protocolLength);
IList<object> sentObjects =
ParseObjectsFromNetworkStream(receivedData, 8 + protocolLength);
InvokeDataReceived(protocol, sentObjects);
}
. 나는 이것이 나중에 스트림에있는 이전 것과 섞여서 보내진 데이터라고 의심한다.
내 질문에,이 버퍼에 어떤 데이터가 저장 될 것으로 예상됩니까? 클라이언트 측에서 두 가지 다른 보내기 작업의 데이터를 포함 할 수 있습니까? 이 경우 클라이언트 측에서 보낸 데이터 '메시지'를 구별 할 수있는 프로토콜이 필요하다고 생각합니다. 간단한 방법은 각 스트림을 특정 (고유 한) 바이트로 시작하고 끝내는 것입니다. 메시지 분리에 대한 일반적인 접근법이 있습니까? 게다가 이것은 단일 수신 호출이 클라이언트로부터 모든 데이터를 얻기에 충분하지 않을 수도 있다는 것을 의미하는 것으로 추측합니다. 이는 최종 바이트가 발견 될 때까지 반복해야한다는 것을 의미합니까?
간결한 답변 주셔서 감사합니다. 현재 솔루션은 길이 프리픽스를 사용하지만 메시지를 구별 할 수는 없습니다. 도착하지 않은 메시지의 부분을 정상적으로 처리하기 위해 어떤 접근법을 사용할 수 있습니까? 타임 아웃 기반 접근 방식을 추구하는 것이 가장 좋은 방법입니까? –
또한, 메시지의 절반은 무엇입니까 - 중간이라고 말하면 분실됩니다. 갑자기 나는 다음 메시지의 반을 파싱하여 보증 된 충돌을 일으킬 것이다. TCP를 맹목적으로 신뢰하여 이러한 일이 발생하지 않도록 할 수 있습니까? –
TCP는 안정적인 스트림을 제공합니다. 그것은 당신을 위해 잃어버린 조각의 재전송을 처리합니다. 연결이 재설정되지 않는 한 상대편 피어에 항상 한 피어에서 보내는 모든 바이트가 올바른 순서로 도착합니다. –