2017-11-21 18 views
0

libpcap에 의존하고 두 개의 스레드를 실행하는 C 프로그램이 있습니다. 하나의 함수는 패킷을 캡쳐하고 소스 IP를 char 배열을 향하는 커스텀 패킷에 추가한다. 두 번째 함수는 2D 배열을 반복하며 각 소스 IP에 대해 사용자 정의 패킷을 전달합니다. 둘 다 동시에 발생하고 둘 다 멈추지 않습니다 (영원히 반복합니다).C에 대한 char 배열에 중복을 추가하지 않으려면 어떻게해야합니까?

문제점 : 두 번째 기능 (보낸 사람)이 유일한 배열의 각 루프 중에 하나의 고유 한 패킷 만 보내고 싶습니다. 속도는 중요합니다. 첫 번째 기능 (패킷 캡처 및 작성자)이 어레이의 서로 다른 복사본을 채우는 것을 원하지 않습니다. 일부 소스는 다른 패킷보다 많은 패킷을 얻는다는 의미입니다. 배열 크기를 30으로 설정하면 동적 크기 조정 hackery가 필요하지 않고 잠시 실행될 때 bazillion 크기가 필요하지 않습니다. 그것이 도움이 될 것입니다 경우

는 여기에 몇 가지 아주 최소한의 의사 : 파이썬의 if not in list 기능이 나 하드 버릇 것처럼 보인다

int i = 0; 

char arrayForCustomPackets[30][7]; 
const char stuffIWantInPackets[3] {0x00, 0x00, 0x00}; 

function1(packet) { 
    memory copy packet.IP to arrayForCustomPackets[i] 
    memory copy stuffIWantInPackets to arrayForCustomPackets[i] + 4 
    ++i 
    printf("Hopefully unique IPs captured in array: %d", i); 
} 

function2() { 
    int a = 0; 
    for (a = 0; a < i; a++;) 
     send packet arrayForCustomPackets[a]; 
} 

main() { 
    create threadA(when specific filtered packet has been captured, do function1); 
    create threadB(do function2 forever); 
} 

. 이것이 C 나 적어도 내 프로그램에서 할 수 없다면, 나는 threadC를 열어야 할 것이라고 생각한다. 희망을 잃어 버렸기 때문에 배열을 통과하는 성능에 너무 가혹하지 않은 알고리즘이되기를 바랍니다.

+0

그것은 C : 물론 할 수 있습니다. 직접 해봐야합니다. 당신이 원하는 것은 해쉬 테이블입니다. 많은 도서관 주변. –

+0

나는 리눅스 커널의 관입 링크드 목록과 해쉬 테이블을 좋아한다. Google은 빠르고 강력하며 유용합니다. 물론 C++ STL을 사용할 수 있다면 더 좋을 것입니다 ... –

+0

흠집, 아주 가벼운 독서를 한 후에 해쉬 테이블이 필요한 것처럼 보입니다. 아마 내 코드에 넣는 고통이 될 것입니다. 저를 올바른 방향으로 가리켜 주셔서 감사합니다! – RSS

답변

0

중요한 값이나 문자열 만 저장하는 다른 배열을 사용하여 실제로 중복을 추가하기 전에 배열을 반복하여 간단히 복제하는 훨씬 쉬운 방법을 발견했습니다. 이미 말한 이유 때문에 큰 배열에 권장되지는 않을 것입니다. 아마도 덜 원하는 big-O 알고리즘 중 하나일까요?

내가 수행 한 작업은 전용 검사 배열 memcpy 문자열을 작성한 다음 memcmp 문자열을 이미 최종 배열로 처리 된 문자열과 비교하는 것입니다. 이미 통과하지 않았거나 이미 처리 된 것은 memcmp이 0 (같음)을 반환하면 간단한 return을 통해 삭제됩니다.

위의 의사에 솔루션을 추가, 정말 첫 번째 기능이 포함됩니다

char dupeCheck[30][4]; 

function1(packet) { 
    int b = 0; 
    for (b = 0; b < i; b++;) 
     int checker; 
     checker = memcmp(dupeCheck[i], packet.IP, 4); 
     if (checker == 0) 
      return function and start on the next packet 
     else 
      continue below and carry on 

    memory copy packet.IP to dupeCheck[i]; 
    memory copy packet.IP to arrayForCustomPackets[i] 
    memory copy stuffIWantInPackets to arrayForCustomPackets[i] + 4 


    ++i 
    printf("Hopefully unique IPs captured in array: %d", i); 
} 

https://www.tutorialspoint.com/c_standard_library/c_function_memcmp.htm

strcmp도 작동을하지만,이 같은 두 개의 배열의 일부를 비교하는 경우 청소기 memcmp는 내 IP/값은 다른 인덱스에 저장되어있는 옥텟을 가지고 있었기 때문에 031 인덱스를 다루기 위해 4 크기를 쉽게 사용할 수있었습니다. strcmp를 사용하면 더 많은 비교를하거나 함께 추가하여 0을 얻는지를 확인해야합니다.