VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 386|回复: 1

VC++打造局域网聊天室-[7]客户端队列及其处理线程

[复制链接]
01_avatar_middle
online_admins admin 发表于 2017-12-25 23:29:55 | 显示全部楼层 |阅读模式
1、加入客户端结点到队列:
CClientItem tItem;
tItem.m_Socket = accSock;
tItem.m_pMainWnd = pChatRoom;
tItem.m_strIp = inet_ntoa(clientAddr.sin_addr);
INT_PTR idx = pChatRoom->m_ClientArray.Add(tItem);
tItem.hThread = CreateThread(NULL, 0, ClientThreadProc, &(pChatRoom->m_ClientArray.GetAt(idx)), CREATE_SUSPENDED, NULL);
pChatRoom->m_ClientArray.GetAt(idx).hThread = tItem.hThread;
ResumeThread(tItem.hThread);

2、聊天信息显示函数:
void CChatRoomDlg::ShowMsg(CString strMsg)
{
        m_MsgEdit.SetSel(-1, -1);
        m_MsgEdit.ReplaceSel(strMsg+_T("\r\n"));
}

3、从队列中删除客户端函数:
void CChatRoomDlg::RemoveClientFromArray(CClientItem in_Item)
{
        for( int idx = 0; idx <m_ClientArray.GetCount(); idx++ ) {
                CClientItem tItem = m_ClientArray.GetAt(idx);
                if ( tItem.m_Socket == in_Item.m_Socket &&
                        tItem.hThread == in_Item.hThread &&
                        tItem.m_strIp == in_Item.m_strIp ) {
                                m_ClientArray.RemoveAt(idx);
                }
        }
}

4、客户端处理线程函数:
#define MAX_BUF_SIZE 1024
DWORD WINAPI ClientThreadProc(LPVOID lpParameter)
{
        CString strMsg;
        CClientItem m_ClientItem = *(CClientItem *)lpParameter;
        while( TRUE ) {
                if ( SOCKET_Select(m_ClientItem.m_Socket, 100, TRUE) ) {
                        TCHAR szBuf[MAX_BUF_SIZE] = {0};
                        int iRet = recv(m_ClientItem.m_Socket, (char *)szBuf, MAX_BUF_SIZE, 0);
                        if ( iRet > 0 ) {
                                //right;
                                strMsg.Format(_T("%s"), szBuf);
                                strMsg = _T("客户端:") + m_ClientItem.m_strIp + _T(">") + strMsg;
                                m_ClientItem.m_pMainWnd->ShowMsg(strMsg);
                        }else{
                                //close socket;
                                strMsg = _T("客户端:") + m_ClientItem.m_strIp + _T(" 离开了聊天室!");
                                m_ClientItem.m_pMainWnd->ShowMsg(strMsg);
                                m_ClientItem.m_pMainWnd->RemoveClientFromArray(m_ClientItem);
                                break;
                        }
                }
                Sleep(500);
        }
        return TRUE;
}


本套教程由VC驿站原创,完全免费!
相关课程演示细节还请观看视频教程!
教程下载地址:http://www.cctry.com/thread-6-1-1.html




上一篇:VC++打造局域网聊天室-[6]异步IO模型及多线程
下一篇:VC++打造局域网聊天室-[8]客户端编程及数据发送

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

75_avatar_middle
在线会员 besteast 发表于 2018-1-21 09:14:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-8-19 10:01

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表