두 개의 스레드가 있으며 각 스레드는 동일한 시간대의 패킷 캡처를 가지고 있지만 두 번째 스레드가 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);
}