2016-04-14 25 views
0

我正在使用Strophe C庫進行XMPP消息傳遞,並使用libwebsock來創建WebSocket服務器。我想要做的就是將接收到的消息轉發給WebSocket客戶端,反之亦然。但我不知道如何做到這一點。何合併來自不同項目的事件循環

strophe和libwebsock都需要運行事件循環來處理事件。我如何運行這兩個循環或將它們合併爲一個以便處理來自同一程序中兩個庫的事件?

在此先感謝。 :)

+1

https://github.com/payden/libwebsock這是libwebsock庫的鏈接。 – tejasdadhe

回答

0

首先你需要創建2個線程。讓thread1分別是libstrophe的事件循環和thread2分別是libwebsock的事件循環。總體思路可以用下一個僞代碼來描述:

xmpp_message_callback() { 
    libwebsock_send_text(); 
} 

thread1() { 
    xmpp_run(); 
} 

libwebsock_message_callback() { 
    xmpp_send(); 
} 

thread2() { 
    libwebsock_wait(); 
} 

main() { 
    init_libstrophe() 
    init_libwebsock(); 
    create_thread1(); 
    create_thread2(); 
    join_thread1(); 
    join_thread2(); 
} 

但由於libstrophe是不是線程安全的,你不能直接從線程2調用xmpp_send()(!)。相反,我會建議使用互斥鎖保護隊列。所以,上面的例子轉換爲:

list queue; 
mutex queue_lock; 

xmpp_message_callback() { 
    libwebsock_send_text(); 
} 

thread1() { 
    while { 
     xmpp_run_once(); 
     mutex_lock(queue_lock); 
     while (queue is not empty) { 
      stanza = list_pop_front(queue); 
      xmpp_send(stanza); 
     } 
     mutex_unlock(queue_lock); 
    } 
} 

libwebsock_message_callback() { 
    mutex_lock(queue_lock); 
    list_push(queue, stanza); 
    mutex_unlock(queue_lock); 
} 

thread2() { 
    libwebsock_wait(); 
} 
+0

Thankyou。 :)將嘗試你的解決方案,並儘快回覆你! – tejasdadhe

+0

只需要清楚,我們在這裏使用互斥鎖來實現互斥測試和設置方法。我對麼?? – tejasdadhe

+0

順便說一句,謝謝!它的工作就像一個魅力.. – tejasdadhe

相關問題