物聯網服務器框架(學習筆記--具有實際項目意義 純C架構更易理解)---使用php開發更簡單

2.創建若干個處理任務的線程,互斥操作任務鏈表--耗時任務在此,此時任務鏈表是空的,注意不要阻塞;

3.創建剔表線程--維護連接表(踢掉超時連接,單位時間內客戶端未與服務器通訊,心跳包);

4.創建服務器,創建哈希表,epoll機制,初步處理數據,首次連接建立連接表,接收到的數據添加到任務鏈表。

這其中有多個線程在運行,處理任務的若干個線程,維護連接表的線程,epool機制的一個線程。

epoll是開始,處理首次連接,建立連接表(id,fd),收到數據,就把數據添加到任務鏈表。

處理任務的線程具有發數據的功能一問一答不是問題,客戶端如何通過服務器訪問其他設備。

我這裏的解決方法是:

*** Error in `./main': double free or corruption (fasttop): 0x00007f8a9c0008c0 ***

重複free導致的。

採用gateway,利用成熟框架開發更簡單。以下2個方法非常重要。

把uid與句柄綁定起來

void Gateway::bindUid(string $client_id, mixed $uid);

 uid解釋:這裏uid泛指用戶id或者設備id,用來唯一確定一個客戶端用戶或者設備,可以是數字也可以是字符串。

判斷$uid是否在線,此方法需要配合Gateway::bindUid($client_uid, $uid)使用。

int Gateway::isUidOnline(mixed $uid);

往uid發數據

void Gateway::sendToUid(mixed $uid, string $message);

因此發送數據必須要知道對方的uid,對方回覆需要簡單處理一下也是可以的,畢竟登錄時,已經bindUid了,知道是要轉發的數據,把自己的uid加上去就好了。做內部協議處理。

大部分時候設備終端和客戶端管理使用的協議不一樣,即使一樣,也不能掛在同一個進程裏,不容易維護,不是像單片機控制幾個io空那樣簡單了。設備端的服務器與管理端的服務器之間具有一層通信,其實那幾個協議都是基於tcp的,裸TCP,HTTP,HTTPS,websocket,wss,同一個進程,也就是所謂的一個端口號,只能處理一個協議,不可能處理幾個協議的,如果可以,那也是分發下去給不同進程處理的。

客戶端發送到設備端:可以通過uid直接下發,但是客戶端的響應包,不能直接返回到客戶端,而是返回到服務器,然後客戶端到服務器查詢。如果使用相同的協議是可以直接收發的了。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章