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直接下發,但是客戶端的響應包,不能直接返回到客戶端,而是返回到服務器,然後客戶端到服務器查詢。如果使用相同的協議是可以直接收發的了。