軟件測試線程池的編碼實現[2] 軟件測試工具
關鍵字:數據庫設計 @param void *——未使用
@return void——無
*/
void ProcessRequest(void *)
{
SOCKET *pSock;
while (pSock = MsgQueue_Recv(g_pQue))
{
int len;
char buf[1024];
len = recv(*pSock, buf, sizeof(buf)-1, 0);
if ( len > 0 )
{
buf[len] = '\0';
if ( strcmp(buf, "Hello!")== 0 )
{
strcpy(buf, "Ok");
send(*pSock, buf, strlen(buf), 0);
}
}
}
}
可以看出,使用了消息隊列后,整個線程池調度非常簡單,由于本書中實現的消息隊列在進行遍歷時不會影響收發,因此可以實時查看有多少客戶在線,使用消息隊列的以下調用函數便可以實現對整個消息隊列的遍歷。
INT MsgQueue_EnumNext(MSGQUEUE *pQueue, VISITFUNC VisitFunc);
這里只需要寫一個訪問函數VisitFunc即可,比如要想將當前所有在線的客戶端連接SOCKET ID打印到圖形界面中,可以寫一個簡單的訪問函數來實現,編碼如下。
INT PrintAllIDToScreen(void *pData)
{
SOCKET *pSock = pData;
WriteToScreen(*pSock); /* WriteToScreen是將數據寫到圖形界面的函數 */
}
再調用“MsgQueue_EnumNext(g_pQue, PrintAllIPToScreen)”語句就可以實現遍歷。
需要注意的是,上面的編碼只是在消息隊列中放入了一個SOCKET ID,在程序中可以定義一個結構體,結構體中可以包含SOCKET ID、客戶端IP地址、連接建立時間等各種信息,然后將結構體發送到消息隊列即可。這樣遍歷的時候就可以看到客戶端IP地址、連接建立的時間等更多的信息了。
文章來源于領測軟件測試網 http://www.kjueaiud.com/