随笔 - 493  文章 - 0  评论 - 97  阅读 - 239万

一个最简单的服务端和客户端(用CSocket)

功能:服务器端程序处于监听状态,等待客户端连接。客户端发来数据后,服务端回发一个消息,同时关闭连接!

源码下载

服务器(采用一个监听线程)核心代码:

BOOL CListenThread::InitInstance()
{
//  if (!AfxSocketInit())
//  {
//      AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
//      return FALSE;
//  }
    m_bListening = TRUE;            // 线程启动时默认处于监听状态
    while(1)
    {
        if(m_bListening)
        {
            StartListen();
        }
    }
 
    return TRUE;
}
 
int CListenThread::ExitInstance()
{
    StopListen();
 
    return CWinThread::ExitInstance();
}
 
BOOL CListenThread::StartListen()
{
    CString sResult;
    try
    {
        if(m_pListenSocket == NULL)
            m_pListenSocket = new CSocket;
        if(m_pListenSocket && m_pListenSocket->Create(m_nPort))      // Create()内部包含了Bind()
        {
            m_pListenSocket->Listen();
            m_pMainDlg->ShowInfo("启动监听成功");
            PostMessage(m_pMainDlg->GetSafeHwnd(), WM_ENABLE_LISTENING, 0, 0);
            while(1)
            {
                CSocket clientSocket;
                if(m_pListenSocket->Accept(clientSocket))
                {
                    char buffer[1024] = {0};
                    CString sText;
                    clientSocket.Receive(buffer, 1024);
                    sText = buffer;
                    m_pMainDlg->ShowInfo(sText);
 
                    CString s = "Thank you, JoeBlack";
                    clientSocket.Send(s, s.GetLength());
//                  send(clientSocket.m_hSocket, s, s.GetLength(), 0);      // 与上一句等效
 
                    if(sText == "close")            // stop listening
                    {
                        StopListen();
                        break;
                    }
                    else if(sText == "quit")        // post a message to let the main thread delete listen-thread
                    {
                        EndMyThread();
                        return TRUE;
                    }
                }
            }
            return TRUE;
        }
    }
    catch (CException* e)
    {
        char str[300] = {0};
        e->GetErrorMessage(str, 300);
        sResult.Format("启动监听失败,错误码:%d", str);
        m_pMainDlg->ShowInfo(sResult);
    }
    catch(...)
    {
        int err;
        err = WSAGetLastError();
        sResult.Format("启动监听失败,错误码:%d", err);
        m_pMainDlg->ShowInfo(sResult);
    }
    m_bListening = FALSE;
 
    return FALSE;
}
 
BOOL CListenThread::StopListen()                    // 停止服务器监听
{
    if(m_pListenSocket)
    {
        m_pListenSocket->Close();
        delete m_pListenSocket;
        m_pListenSocket = NULL;
        m_pMainDlg->ShowInfo("Stop listening successful");
        m_bListening = FALSE;
        m_pMainDlg->PostMessage(WM_ENABLE_LISTENING, 1, 0);  // 让“启动监听”按钮变为可用
    }
    return TRUE;
}
 
BOOL CListenThread::EndMyThread()                       // 关闭CSocket并退出本线程
{
    StopListen();
    m_pMainDlg->ShowInfo("Exit from Listen-Thread");
    PostMessage(m_pMainDlg->GetSafeHwnd(), WM_FREE_LISTENTHREAD, 0, 0);
 
    return TRUE;
}

服务端程序实现监听,当收到close或quit时,会停止监听,这时客户端即使发来数据,也不会被收到。服务器端点击窗口中的“开启监听”后,可以重新开启监听线程。

客户端程序(向server发送消息并接收返回值):

void CClientAppDlg::OnBtnSend()
{
    CSocket sendSocket;
    if(sendSocket.Create())
    {
        if(sendSocket.Connect("127.0.0.1", 5050))
        {
            UpdateData();
            sendSocket.Send(m_strEdit, m_strEdit.GetLength());
            Sleep(100);  // 等待服务器端数据返回
 
            char buf[1024] = {0};
            CString sResponse;
            while(sendSocket.Receive(buf, 1024))
            //while(recv(sendSocket, buf, 1024, 0))
            {
                sResponse += buf;
            }
 
            MessageBox(sResponse);
            sendSocket.Close();
        }
    }
}
posted on   清清飞扬  阅读(2974)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
< 2011年2月 >
30 31 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 1 2 3 4 5
6 7 8 9 10 11 12

点击右上角即可分享
微信分享提示