문제

서버가 클라이언트에 비트 맵이있는 바이트 배열을 보낸 서버-클라이언트 모델을 사용하여 C#에서 응용 프로그램을 개발하고 있으며 클라이언트가 화면에로드하고 서버에 "OK"를 보내고 서버가 전송됩니다. 다른 이미지 등.

이미지 버퍼 삽입의 길이는 일반적으로 60kb에서 90kb 사이이지만 중요하지 않다는 것을 알았습니다. 클라이언트와 서버를 동일한 컴퓨터에 넣으면 LocalHost를 사용하면 모든 것이 잘 작동합니다. 서버가 시작되고 클라이언트가 EndReceive를하고 전체 버퍼가 전송됩니다.

그러나 이제는 무선 네트워크에서 이것을 테스트하고 있으며 발생하는 일은 다음과 같습니다.

  • 서버가 이미지를 보냅니다.
  • 클라이언트에 대한 콜백 함수 data_received는 호출되지만 읽을 수있는 1460 바이트 만 있습니다 (MTU- 왜? UDP에만 있어야합니까?)
  • 클라이언트에서 레시 된 콜백 함수 Data_는 다시 호출됩니다. 이제 버퍼의 나머지 부분 (1000 바이트 또는 100kbytes)이 있습니다 ...

항상 이와 같습니다. 1460 바이트가있는 첫 번째 패킷이 수신되고 두 번째 패킷에는 나머지 패킷이 포함되어 있습니다.

수신 된 두 바이트 배열에 합류 하여이 문제를 해결할 수 있지만 이것은 옳지 않은 것 같습니다. 왜 이런 일이 일어나고 있는지 잘 모르겠습니다. 네트워크에 약간의 제한이 있습니까? 그렇다면 왜 C# 전체 데이터가 전송 될 때까지 기다리지 않습니까? 내 말은, 그것은 TCP입니다. 걱정할 필요가 없습니다.

어쨌든, 어떤 도움이든 좋을 것입니다!
건배

도움이 되었습니까?

해결책

TCP입니다. 데이터를 개울. 스트림이 패킷으로 어떻게 분해되는지 신경 쓰지 않거나 그것에 대해 가정하지 않아야합니다.

단일 "블록"의 데이터를 수신 해야하는 경우, 가장 간단하게 수행하는 가장 간단한 방법은 길이 (예 : 32 비트 값)로 접두사를 접두사하는 것입니다. 당신은 길이를 읽습니다 (바이트조차도 ~할 수 있었다 여러 패킷을 통해 분할 된 다음 모든 데이터를 읽을 때까지 매번 읽는 금액을 기록한 (동기 또는 비동기 적으로) 반복적으로 읽습니다 (동기 또는 비동기 적으로).

다른 팁

읽어보세요 9.2.4

응용 프로그램 계층 프로토콜을 해부 할 때 각 TCP 패킷에 정확히 하나의 응용 프로그램 계층 메시지가 포함되어 있다고 가정 할 수 없습니다. 하나의 응용 프로그램 계층 메시지는 여러 TCP 패킷으로 분할 될 수 있습니다.

John의 답변에 추가 :

int offset = 0;
int imagesize = 512;
byte[] buffer = new byte[512];

tcpChannel.Read(buffer, offset, imagesize);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top