2013-03-07 3 views
1

3 개의 구성 요소 client-proxy-server가 있습니다. 프록시가 과도하게로드 될 때 소켓 버퍼가 1MB가 채워지는 것으로 구성됩니다. 한 번에 전체 버퍼를 1MB 읽은 다음 처리하는 방법이 있습니까? FYIUDP 전체 소켓 버퍼를 한 번에 읽으십시오.

:

  1. 모든 데이터 그램이 MTU 사이즈 넘어 절대 각 패킷의 길이에 첨가되는 당 정의 구조 형식에있다. 클라이언트 & 서버 사이에서

  2. 프록시 데이터를 라우트, 그래서 프로듀서 & 소비자 스레드를 가지고 시도했지만 문제는

+0

리눅스에는 여러 패킷을 한꺼번에 수신 할 수있는 분산/수집 API가 있습니다. 사용하기에는 좋지 않습니다. 더 나은 것에 대한 제안이 있습니다. 그러나 anyoen이 그것을 구현 한 적이 없다고 생각합니다. – PlasmaHH

답변

2

짧은 대답 해결되지 않습니다 : 없음.

긴 대답 : 버클리 스타일 소켓 구현에서는 호출 당 하나의 패킷 만 수신하거나 보낼 수 있습니다. 따라서 완전한 네트워크 스트림을 읽고 다른 쪽에서 재생할 수는 없습니다.

UDP 소켓이 여러 소스에서 데이터를받을 수 있다는 한 가지 이유가 있습니다. 인터페이스는 보낸 사람 소켓 주소와 같은 메타 정보와 최소한 패킷 크기를 호출자에게 전달할 수 있어야합니다. 이것은 데이터 묶음을 파싱해야하는 기준이며 조건을 충족하는 패킷을 선택합니다. 마지막으로 보낼 패킷 묶음을 만들 수 있습니다.

각 패킷을 검사 할 가능성이 있으므로 패킷이 실제로 예상되는 경우 묶음에서 패킷을 읽는 기능이 필요합니다. 이것은 함수 recvfrom입니다.

+0

Harper, 이것은 "빠르다"는 답변입니다. 감사합니다. "recvfrom/sendto"를 사용하는 대신 recv/send를 사용하여 recv 나 UDP 데이터를 보낼 수도 있습니다. 그래서, 이것이 "전체 소켓 버퍼 읽기"아이디어가 나오는 곳입니다. 포인터를 하나 더 추가하여 생각해보십시오. – user2144068