두 개의 스레드가 있으며 각 스레드는 동일한 시간대의 패킷 캡처를 가지고 있지만 두 번째 스레드가 pcap_compile()
기능에 도달하면 프로그램이 중단됩니다. 또한 각 스레드는 자체 변수를 가지며 전역 변수를 사용하지 않습니다. 그들은 장치의 동일한 핸들을 얻는 것으로 보이므로 프로그램이 충돌합니다. 왜 두 개의 스레드가 필요합니까? 왜냐하면 나는 지정된 패킷 pcap
에 의해 보내진 패킷과 분리 된 패킷을 분리하기를 원하기 때문입니다. 어떻게 해결할 수 있을까요? 또는 하나의 스레드를 사용하고 머리글 tcp
의 주소를 사용하여 보내고받은 패킷을 수동으로 정렬하는 것이 더 좋습니까?동시에 한 장치에 두 pcap_compile()?
1
A
답변
1
pcap_compile은 이 아니며 스레드로부터 안전합니다. 표현식을 컴파일하는 파서 내에서 스레드 안전하지 않은 상태로 인해 오류를 방지하려면 임계 섹션/뮤텍스가있는 별도의 스레드에서 발생할 수있는 모든 호출을 처리해야합니다 (세부 사항은 YACC를 사용하여 표현식을 파싱하면 생성 된 코드는 입니다. 즉,은 thread safe가 아닙니다.)
캡쳐에 사용할 스레드별로 장치를 명시 적으로 열어야합니다. 여러 스레드에서 동일한 장치 핸들을 다시 사용하면 요청하는대로 처리 할 수 없습니다. 사용하려고 계획중인 스레드 내에서 pcap 핸들을 열어야하므로 캡처를 계획중인 각 스레드는 자신의 pcap_open
을 수행해야합니다.
pcap_compile
에 대한 호출을 보호하기 위해 (창 C++ 래퍼 중요 섹션) :
class lock_interface {
public:
virtual void lock() = 0;
virtual void unlock() = 0;
};
class cs : public lock_interface {
CRITICAL_SECTION crit;
public:
cs() { InitializeCriticalSection(&crit); }
~cs() { DeleteCriticalSection(&crit); }
virtual void lock() {
EnterCriticalSection(&crit);
}
virtual void unlock() {
LeaveCriticalSection(&crit);
}
private:
cs(const locker &);
cs &operator=(const cs &);
};
class locker {
lock_interface &m_ref;
public:
locker(lock_interface &ref) : m_ref(ref) { m_ref.lock(); }
~locker() { m_ref.unlock(); }
private:
locker(const locker &);
locker &operator=(const locker &);
};
static cs section;
int
wrapped_pcap_compile(pcap_t *p, struct bpf_program *fp, const char *str, int optimize, bpf_u_int32 netmask)
{
locker locked(section);
pcap_compile(p, fp, str, optimize, netmask);
}
관련 문제
- 1. 동시에 여러 장치에
- 2. 한 번에 두 데이터베이스를 사용하고 두 위치에서 동시에 업데이트하는 방법
- 3. 두 스트림에 동시에 쓰기
- 4. 두 데이터베이스를 동시에 잠급니다.
- 5. 동시에 두 셀에 쓰기
- 6. 두 동영상을 동시에 재생
- 7. 두 요소를 동시에 반복하기
- 8. 두 모델을 동시에 생성하십시오.
- 9. 두 소켓 연결을 동시에 수신하는 두 개의 스레드를 생성합니다.
- 10. 동시에 두 구성 요소를 동시에 스크롤
- 11. 두 개체를 동시에 만듭니다.
- 12. 필터링 두 개의리스트가 동시에
- 13. 두 스레드가 동시에 시작되도록하십시오.
- 14. 동시에 두 테이블에서 업데이트
- 15. 동시에 두 동작 실행
- 16. 동시에 두 라디오 버튼
- 17. 두 변수를 동시에 초기화
- 18. 두 활동을 동시에 시작하십시오.
- 19. 동시에 두 데이터베이스 업데이트
- 20. 두 함수를 동시에 호출하십시오.
- 21. 동시에 두 기능 실행
- 22. 두 문자열을 동시에 교환하십시오
- 23. 두 개체를 동시에 처리합니다.
- 24. Eclipse에서 동시에 실행되는 여러 장치에 대해 Logcat을 얻는 방법
- 25. 캡처 한 그림을 장치에 저장해야합니까?
- 26. ADB : adb 명령을 사용하여 다중 장치에 apk를 동시에 설치하는 방법
- 27. 안드로이드에서 블루투스 - 동시에 둘 이상의 블루투스 장치에 연결할 수 있습니까?
- 28. Android : 동시에 두 가지 활동
- 29. ASP.NET에서 두 이벤트가 동시에 발생했습니다.
- 30. 동시에 두 개의 콘텐츠보기를 적용해야합니다.