2010-12-08 68 views
0

我正在編寫一個使用libwireshark的應用程序,儘管這裏的具體內容並不完全相關。在單個函數中包裝來電/回調

我爲圖書館準備一個數據包進行解剖,因此調用epan_dissect_run(packet),依次解析給定的數據包,然後調用我指定的回調函數 - 使用register_tap_listener()

我的問題是:如何將這個過程包裝在一個函數中,dissected_information* MyDissectPacket(packet)?正如我所概括的,這不僅適用於libwireshark,而且適用於一般情況下明智地使用回調的庫。

答案取決於回調是異步執行的,在另一個線程還是兩者都執行?如果回調在同一個線程中同步執行,這是否會使包裝代碼更簡單?

也許這是我的Google-fu軟弱 - 我不知道我應該使用哪些術語,因爲這個問題肯定有很多次被問過。

回答

1

如果你不知道它是否是異步的,你應該寫下你的函數,如果它是。

這是一個生產者/消費者問題:有沒有什麼可以消化的 - 包被解剖了嗎?所以信號量可以解決它,直到有東西消耗。您的回調函數必須表明數據包解析已完成 - 有一些消耗。

而我會做的是(僞代碼):

void my_callback() 
{ 
    semaphore.post() 
} 

// ... 

dissected_information* MyDissectPacket(packet) 
{ 
    epan_dissect_run(packet) // asynchronous or not call 
    semaphore.wait()   // if it is, it will stop here and wait the post() of the 
          // callback 
          // if it is not, it will result exaclty like above, but the 
          // semaphore will always be already "posted"; so you will just have 
          // a useless semaphore. 
} 

我希望我理解正確的話您的問題...

編輯: 在你的情況下,通過讓您的結果回調:

void my_callback(result) 
{ 
    shared_var_result = result; 
    semaphore.post() 
} 

// ... 

dissected_information* MyDissectPacket(packet) 
{ 
    epan_dissect_run(packet) // asynchronous or not call 
    semaphore.wait()   // if it is, it will stop here and wait the post() of the 
          // callback 
          // if it is not, it will result exaclty like above, but the 
          // semaphore will always be already "posted"; so you will just have 
          // a useless semaphore. 
    return shared_var_result 
} 

我看不到任何其他合理的解決方案。

+0

在這種特殊情況下,工作是同步完成的。我想我正在尋找的是一種從稱爲解剖例程的函數中訪問解剖結果的方法。我知道這可以使用全局變量來完成,但是肯定有更好的方法嗎? – 2010-12-08 05:38:23

相關問題