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를 열어야 할 것이라고 생각한다. 희망을 잃어 버렸기 때문에 배열을 통과하는 성능에 너무 가혹하지 않은 알고리즘이되기를 바랍니다.
그것은 C : 물론 할 수 있습니다. 직접 해봐야합니다. 당신이 원하는 것은 해쉬 테이블입니다. 많은 도서관 주변. –
나는 리눅스 커널의 관입 링크드 목록과 해쉬 테이블을 좋아한다. Google은 빠르고 강력하며 유용합니다. 물론 C++ STL을 사용할 수 있다면 더 좋을 것입니다 ... –
흠집, 아주 가벼운 독서를 한 후에 해쉬 테이블이 필요한 것처럼 보입니다. 아마 내 코드에 넣는 고통이 될 것입니다. 저를 올바른 방향으로 가리켜 주셔서 감사합니다! – RSS