VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

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

VC++打造局域网聊天室-[8]客户端编程及数据发送

[复制链接]
01_avatar_middle
online_admins admin 发表于 2017-12-25 23:31:15 | 显示全部楼层 |阅读模式
1、客户端编程流程:
TCP服务端:WSASartup、socket、bind、listen、accept、read、write、closesocket、WSACleanup。
TCP客户端:WSASartup、socket、connect、read、write、closesocket、WSACleanup。

2、客户端连接线程:
DWORD WINAPI ConnectThreadFunc(LPVOID pParam)
{
        CChatRoomDlg *pChatRoom = (CChatRoomDlg *)pParam;
        ASSERT(pChatRoom != NULL);
        pChatRoom->m_ConnectSock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);
        if ( pChatRoom->m_ConnectSock == INVALID_SOCKET ) {
                AfxMessageBox(_T("新建Socket失败!"));
                return FALSE;
        }
        CString strServIp;
        pChatRoom->GetDlgItemText(IDC_IP_ADDR, strServIp);
        int iPort = pChatRoom->GetDlgItemInt(IDC_CONNECT_PORT);
        if ( iPort <= 0 || iPort > 65535 ) {
                AfxMessageBox(_T("请输入合适的端口:1 - 65535"));
                goto __Error_End;
        }
        char szIpAddr[16] = {0};
        USES_CONVERSION;
        strcpy_s(szIpAddr, 16, T2A(strServIp));

        sockaddr_in server;
        server.sin_family = AF_INET;
        server.sin_port = htons(iPort);
        server.sin_addr.s_addr = inet_addr(szIpAddr);
        if ( connect(pChatRoom->m_ConnectSock, (struct sockaddr *)&server,  sizeof(struct sockaddr)) == SOCKET_ERROR ) {
                AfxMessageBox(_T("连接失败,请重试!"));
                goto __Error_End;
        }
        pChatRoom->ShowMsg(_T("系统信息:连接服务器成功!"));
        while( TRUE ) {
                if ( SOCKET_Select(pChatRoom->m_ConnectSock) ) {
                        TCHAR szBuf[MAX_BUF_SIZE] = {0};
                        int iRet = recv(pChatRoom->m_ConnectSock, (char *)szBuf, MAX_BUF_SIZE, 0);
                        if ( iRet > 0 ) {
                                //right;
                                pChatRoom->ShowMsg(szBuf);
                        }else{
                                //close socket;
                                pChatRoom->ShowMsg(_T("聊天室服务器已停止,请重新进行连接!"));
                                break;
                        }
                }
                Sleep(500);
        }

__Error_End:
        closesocket(pChatRoom->m_ConnectSock);
        return TRUE;
}

2、封装消息发送函数:
void CChatRoomDlg::SendClientsMsg(CString strMsg, CClientItem *pNotSend)
{
        TCHAR szBuf[MAX_BUF_SIZE] = {0};
        _tcscpy_s(szBuf, MAX_BUF_SIZE, strMsg);
        for( INT_PTR idx = 0; idx < m_ClientArray.GetCount(); idx++ ) {
                if ( !pNotSend || pNotSend->m_Socket != m_ClientArray.GetAt(idx).m_Socket ||
                        pNotSend->hThread != m_ClientArray.GetAt(idx).hThread ||
                        pNotSend->m_strIp != m_ClientArray.GetAt(idx).m_strIp) {
                                send(m_ClientArray.GetAt(idx).m_Socket, (char *)szBuf, _tcslen(szBuf)*sizeof(TCHAR), 0);
                }
        }
}

3、所处的身份状态:
void CChatRoomDlg::OnBnClickedSendmsg()
{
        CString strMsg;
        GetDlgItemText(IDC_INPUT_MSG, strMsg);
        if ( m_bIsServer == TRUE ) {
                strMsg = _T("服务器:>") + strMsg;
                ShowMsg(strMsg);
                SendClientsMsg(strMsg);
        }else if (m_bIsServer == FALSE) {
                CString strTmp = _T("本地客户端:>") + strMsg;
                ShowMsg(strTmp);
                int iSend = send(m_ConnectSock, (char *)strMsg.GetBuffer(), strMsg.GetLength()*sizeof(TCHAR), 0);
                strMsg.ReleaseBuffer();
        }
        SetDlgItemText(IDC_INPUT_MSG, _T(""));
}


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




上一篇:VC++打造局域网聊天室-[7]客户端队列及其处理线程
下一篇:VC++打造局域网聊天室-[9]程序关闭及线程的结束

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

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

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

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

本版积分规则

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

GMT+8, 2018-12-10 13:31

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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