設計乙個位於訊息收聽端和訊息廣播端的使用者列表,用來存放所有已連線客戶的socket
,並且根據send()
情況對該列表進行更新,同時,廣播時也應該遮蔽該條訊息的**客戶。
為了記載使用者的套接字及其位址資訊,採用std::map
的容器建立對映。為了封裝這麼乙個容器,我寫了乙個簡單的類。
由於在廣播過程中需要迭代獲取每一位當前使用者,所以需要為這個類設計乙個迭代介面。
class
cclientinfo
;
為什麼需要兩種刪除使用者的函式,這是因為在接收端也可以根據recv()
的返回結果,判定一名已知使用者已經斷開連線。此時也可以呼叫刪除使用者的函式,屬於在非迭代過程中刪除。
而在廣播端,由於廣播的過程是依靠迭代實現,所以此時根據send()
結果刪除已掉線客戶,屬於在迭代過程中刪除。
重點比較兩種不同的刪除介面的設計方法,需要注意的點是,如何避免迭代器因為不適當的擦除過程而失效。迭代器失效會導致迭代出錯。
另乙個前提是,我為需要用到該迭代方法的類中設計了乙個迭代器成員,通過引用傳值,將迭代器送入介面,介面修改迭代器使迭代器指向某一元素。
bool cclientinfo::
iter
(std::map
::iterator& it)
}else
return in_iter;
}
void cclientinfo::
toss
(socket& s, std::map
::iterator& it)
else
map.
erase
(s);
}void cclientinfo::
toss
(socket& s)
注意需要自己宣告乙個迭代器用於傳入
std::map
::iterator it;
將產品庫宣告再全域性中,方便不同的類直接訪問
cclientinfo cinfo
(實際上在實踐過程中,我出現了重複宣告的問題,無法用extern
解決,目前尚不清楚原因,最後用到了__declspec(selectany)
語句來宣告變數,這在官方的文件裡是不被推薦的。)
迭代過程如下:
...
while
(cinfo.
iter
(it)
)}
由於目前客戶端還不成熟,所以我將該方法複製到了乙個簡單的測試例子中,進行測試。
#include
#include
using
namespace std;
class
mymap
void
put(
int& i,
char
& c)
void
toss
(int
& i, map<
int,
char
>
::iterator& it)
else
m.erase
(i);
}void
toss
(int
& i)
bool
iter
(map<
int,
char
>
::iterator& it)
}else
return in_iter;}}
;
首先將物件宣告在全域性中,然後再主函式中給產品庫中傳值若干次。隨後進行一次迭代過程,展示迭代效果,最後進行迭代中刪除元素的測試。
mymap m;
intmain()
while
(m.iter
(it)
)else
}return0;
}
第二次迭代的預期輸出結果應為從'b'
到'd'
,因為首位元素應被刪除。
若將第二次迭代中擦除條件改為'd'
,應輸出'a'
到'c'
。
太好啦!
python讀取列表中的元素並插入MySQL資料庫
列表的資料項不需要具有相同的型別 list 1,2,3,4,5,6,7 print list 1 5 輸出結果為 2,3,4,5 python讀取列表中的元素並插入mysql資料庫 coding utf 8 import pymysql list 20,5,wangyan connent pymys...
自己封裝的乙個模擬下拉列表的外掛程式
簡述 通過使用simselect 可以實現由傳統 html 模擬類似於原生 select 標籤的功能。主要是解決select 標籤樣式在不同瀏覽器中的相容性問題。通過模擬,使用者便可以完全自定義下拉列表的樣式。該工具主要有以下幾種功能 結構 通過使用simselect 可以在指定的 dom物件內生成...
Android中乙個動態更新時間並顯示的小例子
這是乙個利用執行緒和handler配合更新時間的小例子 1.主activity public class testtimechangedactivity extends activity 控制時間更新的執行緒 private class timethread extends thread 實際更新時...