2012-02-17 3 views
1

C에서 다중 스트림 (각 스트림은 자체 버퍼가 필요함)을 버퍼링하려면 어떻게해야합니까?C에서 다중 버퍼 관리

나는 내 머리에 솔루션을 함께 넣어의 종류 :

{ 
    stream_id 
    buff_ptr 
} 
:

이 이론은 "의사 코드"

[ptr, ptr, ptr, ptr ... ] 

ptr은 구조체에 대한 포인터입니다

stream_id은 스트림의 ID입니다. (해당 정보가 있습니다. rmation)이고 buff_ptr은 일부 malloc 데이터에 대한 포인터입니다. 또한, 버퍼는 아마 유연해야하고 그것이 유연한 (적어도 내가이 나는 ​​기본적으로 내가 반복하여 필요한 버퍼를?

찾아 낼 것이라고 생각 mallocfree 많은 전화를해야 할 것 ptr의 배열을 통해. 그래서


것을 "아키텍처"좋은, 또는이 더 나은 하나?

사람 "이 냥가하는 그녀는 왜?! 것이 필요"궁금해하는 경우 I Ruby/EventMachine에서 서버를 만들었습니다. 프로토콜은 실제로 썩은 (적어도) 말하고 내가 어떻게 처리 해야할지 모르겠어 ... EventMachine 나를 위해 그것을 버퍼 강제로 방법이 없다면, 그게 최고의 솔루션, 내 생각 엔.

감사합니다.

피셔 : 레이브에 대해 사과하십시오! ~

+0

'stream_id'가'0'에서'N'까지의 정수이면'buff_ptr'의 배열을 사용할 수 있고'struct'의 목록을 검색하여 필요한 스트림을 찾을 필요가 없습니다. – hmjd

+0

@hmjd 아, 그렇지 않습니다. 나는 그것이 처음에 있다고 생각했다. 때로는 때로는 그렇지 않은 경우도 있습니다. 정말 약간 무작위입니다. 그리고 거의 0으로 시작하지 않습니다. 실제로는 제가 생각하기에. – omninonsense

+0

'stream_id'에 대한 미리 정의 된 범위가 있습니까? 만약 당신이 희소 배열을 사용할 수 있습니다. – hmjd

답변

1

음, 유일한 옵션을 보인다하지만 당신은 몇 가지를 변경할 수 있습니다

  • 하지 mallocfree를 수행합니다. 확인을 할 수있는 목록을 realloc에게 대신
  • 순회를 사용하지만, 버퍼

    • 의 많은 경우 당신은 발신자가 당신에게 버퍼에 대한 포인터를 전달 할 수 있습니까?
    • 목록 대신 해시를 사용하고 stream_id으로 검색 할 수 있습니까? 예를 glib2 provides such a hash
  • (예를 들어, epoll에 대한)

많은 API의 당신은 ID (epoll 파일의 경우에는 기술자)로 포인터를 연결할 수 있습니다. 흥미로운 일이 생길 때 API는 4-8 바이트의 메모리를 소비하면서 포인터를 0으로 돌려 준다.

+0

C에 해시 같은 것이 있습니까? 나는 거기에 있었다는 것을 몰랐다! * C 뉴비는 여기 ~ * – omninonsense

+1

@withadot. 표준이 없습니다. 직접 구현하거나 기성품을 사용할 수 있습니다 (예 : [glib2 hash] (http://developer.gnome.org/glib/2.28/glib-Hash-Tables.html)). – cnicutar

+0

오. 멋지다. 간단한 "설치"가 있습니까? – omninonsense

0

간단한 이벤트 루프를 만들고 폴링 파일 설명자를 처리하게하려면 libev을 사용하십시오. 거기에 많은 예제가 있고 그것을 수동 페이지 (man 3 libev) 내가 읽은 최고의 중 하나입니다.

몇 가지 콜백을 정의하고 읽기 및 쓰기 풀용 버퍼를 만듭니다. 이러한 풀의 크기는 버퍼가 가득 차거나 소모 될 때 읽기 및 쓰기를 차단하거나 건너 뛸 때만 정적으로 유지 될 수 있습니다.