2014-12-02 4 views
1

두 개의 스레드가 있으며 각 스레드는 동일한 시간대의 패킷 캡처를 가지고 있지만 두 번째 스레드가 pcap_compile() 기능에 도달하면 프로그램이 중단됩니다. 또한 각 스레드는 자체 변수를 가지며 전역 변수를 사용하지 않습니다. 그들은 장치의 동일한 핸들을 얻는 것으로 보이므로 프로그램이 충돌합니다. 왜 두 개의 스레드가 필요합니까? 왜냐하면 나는 지정된 패킷 pcap에 의해 보내진 패킷과 분리 된 패킷을 분리하기를 원하기 때문입니다. 어떻게 해결할 수 있을까요? 또는 하나의 스레드를 사용하고 머리글 tcp의 주소를 사용하여 보내고받은 패킷을 수동으로 정렬하는 것이 더 좋습니까?동시에 한 장치에 두 pcap_compile()?

답변

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); 
} 
관련 문제