버퍼링 데이터를 처리하는 방법 네트워크에서 읽는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1403986

문제

네트워크를 통해 데이터를 읽을 때 데이터를 수신 할 버퍼를 지정합니다.

byte[] b = new byte[4096];
socket.Receive(b);

이제 나의 첫 번째 생각은 물론 수신 버퍼를 클래스의 멤버 변수로 선언하여 수신 버퍼를 재사용하는 것입니다. 다음 문제는 내가 기대하는 모든 데이터를 수신하지 않았으므로 데이터를 버퍼링해야한다는 것입니다. 이는 수신 된 바이트 수를 추적하고 오프셋을 지정하여 쉽게 달성 할 수 있습니다.

socket.Receive(m_ReceiveBuffer, count, m_ReceiveBuffer.Length - count);

이제 여기서 문제는 여전히 충분하지 않은 경우 메모리를 복사 하고이 버퍼로 계속 수신하는 버퍼를 키워야한다고 생각합니다. 무언가 잘못되었다고 가정하면,이 버퍼는 계속 커지고 충분한 메시지가 수신되면 시스템이 메모리에서 실행되지 않습니다.

이것을 올바르게 처리하는 방법이 있습니까? 내가 말하고있는 채우기, 복사, 성장, 채우기, 복사, 성장하는 것보다 데이터를 수신하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

청크로 읽기 :

const int ChunkSize = 4096;
int bytesRead;
byte[] buffer = new byte[ChunkSize];
while ((bytesRead = socket.Receive(buffer, 0, ChunkSize, SocketFlags.None)) > 0)
{
    byte[] actualBytesRead = new byte[bytesRead];
    Buffer.BlockCopy(buffer, 0, actualBytesRead, 0, bytesRead);
    // Do something with actualBytesRead, 
    // maybe add it to a list or write it to a stream somewhere
}

다른 팁

System.net.sockets.socket을 시작하기 전에 System.net.sockets.tcpclient (또는 UDPClient)를 사용할 수 없다고 확신합니까?

그렇지 않은 경우,받는 데이터의 양이 요청한 것과 같을 필요는 없으므로 항상 Receime 기능에서 반환 값을 살펴 봐야합니다. 그리고 기억이 떨어지지 않는 유일한 방법은 실제로 당신이받는 것을 처리하는 것입니다.

먼저 코드를 데이터 수신으로 분리하고 데이터를 처리하십시오. 수신 버퍼는 코드가 처리 영역에 복사 할 수있는 기회가 될 때까지 데이터를 보유해야합니다. 처리 영역은 유용한 작업을 수행하기에 충분한 데이터를 수신했는지 판단 할 수있는 곳입니다. 이런 일이 발생할 때까지 네트워크 수신 버퍼에 데이터를 남겨 두지 마십시오. 네트워크 수신 버퍼의 경우 원형 버퍼를 사용하면 버퍼를 재사용한다는 아이디어에 도움이 될 것입니다. 바라건대, 당신은 메시지 크기에 대한 아이디어가 있습니다. 버퍼의 크기를 결정하는 데 도움이됩니다. 원형 버퍼의 읽기 및 쓰기 포인터가 만나면 (또는 유사한 것), 버퍼의 크기를 늘리십시오. 버퍼의 크기가 충분히 커지면 버퍼에서 충분한 데이터를 프로세싱 코드로 읽을 수있어서 원형 버퍼가 오버플로되지 않을 정도로 빠른 속도로.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top