2009-02-04 2 views
7

일반 네트워크 트래픽에서 중간 스트림 인 zlib 압축 스트림으로 전환 할 수 있어야하는 네트워크 응용 프로그램을 구축하고 있습니다. 이 문제에 대한 내 생각에는 네트워크 코드가 네트워크 코드를 통해 모든 데이터를 전달할 수있는 클래스를 통해 부울 전환을 수행하고 압축 해제 된 스트림을 추출하여 기존 프로토콜 분석 코드로 전달합니다..NET에서 좋은 zlib 구현?

것들 내가 검토 한 :

  • ZLib.NET - 내가 원하는 꽤 무엇을 조금 ... Ecclectic 것, 그리고. 그래도 괜찮은 출발을 할 수 있습니다. (Jon Skeet's comments here도 나를 자극하지 않습니다.)
  • SharpZipLib - 이것은 zlib를 전혀 지원하지 않는 것 같습니다. 누구든지 이것을 확인하거나 거부 할 수 있습니까?

나는 매우 선호하고 모든 관리 솔루션을 선호하지만, 거기에 ...이 라이브러리의 다른 구현은 .NET에 있습니다. 그 기능은 내가하고 싶은 일에 더 적합 할 수 있습니다. 또는 ZLib.NET을 시작으로 시작해야합니까?

PS :

존의 그래서 여기있다, 자세한 내용에 대해 물었다.

MCCP 2을 구현하려고합니다. 여기에는 네트워크 스트림에서 전송되는 신호가 포함되며이 신호 이후의 모든 것은 zlib 압축 데이터 스트림입니다. 위 링크에서 의미하는 바를 정확하게 링크 할 수 있습니다. 어쨌든, 분명히 말하자면, 나는이 (클라이언트가 아닌 서버)의 끝 부분에 있으며 네트워크 스트림에서 이미 많은 데이터를 읽었으며 토글은이 중간에있을 것입니다 가능성이 가장 적다), 어떤 솔루션도 NetworkStream을 인수하기 전에 (또는 나머지 데이터를 수동으로 공급하기 전에) 추가 데이터를 입력 할 수 있어야한다.

+0

특정 패킷을 받았을 때 zip 헤더가 시작됩니까? –

+0

나는 이것에 대해 잘 모른다. 개인적으로 나는 그 정도의 세부 사항에 너무 많은 관심을 기울이지 않는다. 서버 구현에만 해당 될 것이라고 생각합니다. 설명 문서에는 언급이 없습니다. –

+0

MCCP 2에 적합한 라이브러리를 얻었습니까? – m4tt1mus

답변

2

이 게시물에서 허용되는 대답 : Zlib-compatible compression streams이 도움이됩니까?

+0

GZipStream을 시도한 적은 없지만 gzip이 아니라는 zlib 홈페이지에 큰 메모가 있기 때문에 처음에는 어쨌든 물어볼 것이라고 생각했습니다. –

+1

GZipStream이 작동하지 않습니다. 헤더 및 마술 번호에 대해 불평하는 InvalidDataException을 발생시킵니다. –

+0

@MatthewScharley 당신은 아마도'GZipStream'이 아닌'DeflateStream'을 원할 것입니다. 후자는 전자를 감싸고 CRC 체크섬을 추가/확인합니다 (헤더도 가능). –

0

나는 .NET 당신에게 게리 쇼의 ZLIB 래퍼를 추천 할 수 있습니다 :

http://www.organicbit.com/zip/

+0

이것은 시험판이며, 모노에 대비해 제작 중이므로 두통을 덜어 내고 명확하게 조정하려는 유혹을 갖지만 여전히 확인해 보겠습니다. –

+0

우리는 2 년 넘게 프로덕션 환경에서 .NET과 Mono를 함께 사용했습니다. 지금까지 고통이 없습니다. –

3

SharpZipLib 지원 ZLIB 않습니다. this FAQ entry을보십시오.

또한 System.IO.Compression 네임 스페이스가 필요한 것을 지원하는지 확인 했습니까?

스트림은 함께 연결되도록 설계되었지만 IEnumerable<byte>은 사용하지 않습니다.

EDIT : 좋아요. 버퍼링을 지원하는 스트림이 필요하지만, BufferedStream보다 많은 제어 기능을 제공하는 것처럼 들립니다. 압축 해제 토글을 본 경우 스트림을 "되감 으"해야하고 그 위에 GZipStream을 생성해야합니다. 되감기 할 버퍼가 항상 충분하도록 Read() 호출에 대한 가장 큰 호출만큼 버퍼가 커야합니다.

+0

IEnumerable에 관한 귀하의 요점에 동의합니다 ... 사실 문제는 연결하기 전에 이미 zlib 스트림으로 읽은 데이터를 푸시 할 수있는 방법을 찾을 수 없습니다 (이 전환이 중간 스트림에서 발생하기 때문에). 네트워크 스트림. 거기에 어떤 제안? –

+0

당신이하는 일이 내게 완전히 명확하지 않습니다. 출력 스트림이 두 가지가 있으며 두 스트림을 전환하고 싶습니까? 사실, 나는 당신이 읽고 있거나 글을 쓰고 있는지를 "알지 못한다". 질문에서 더 많은 설명이 더 나은 아이디어를 얻을 수 있습니다 :) –

+0

요청에 따라 더 많은 정보! –

0

내가 아는 한 ZLib (gzip) 라이브러리는 헤더의 파일을 나열하는 것을 지원하지 않습니다. 그것이 당신에게 중요한 것이라고 가정하지만, 그것은 큰 결점이있는 것처럼 보입니다.얼마 전에 예리한 zip 라이브러리를 사용 했으므로 이것을 삭제하려고합니다.

+0

이것은 원격 콘솔의 네트워크를 통한 압축입니다. 파일 이름이 없습니다. 그래서 그것은별로 중요하지 않습니다. 그러나 당신의 대답에 대한 응답으로, (gzip과 bzip2가 마음에 들지 않는) 압박감이 있습니다. 그래서 그들은 일반적으로 타르와 함께 사용됩니다. –

+0

이것은 실제로 파일 이름을 표시하지 않은 압축 용 gzip입니다. –

+0

죄송합니다 일산화탄소로 내가 질문을 더 명확하게 읽었어야합니다 ... 안녕히 주무세요 10 분 안에 게시물 –

3

DotNetZip에 포함되어 있으며 zlib 데이터 스트림을 압축하거나 압축 해제하기 위해 ZlibStream이 있습니다. 요청하지 않았지만 GZipStream과 DeflateStream도 있습니다. ZlibCodec 클래스뿐만 아니라, 그것이 당신 일이라면. (단지 스트림을 반대로 버퍼를 팽창 시키거나 수축시킵니다).

DotNetZip은 자유 라이센스가있는 완전 관리 라이브러리입니다. Zlib에 들어가기 위해 .zip 기능을 사용할 필요가 없습니다. 그리고 zlib 파일은이 목적을 위해서 별도의 (더 작은) DLL로 패키지되어 있습니다.