MFC学习笔记之——>MFC下的TCP通信的建立

来源:互联网 发布:大数据平台构建 编辑:程序博客网 时间:2024/06/09 16:10

MFC学习笔记之——>MFC下的TCP通信的建立

总述:

TCP的通讯过程比UDP复杂的多,必须依据C/S架构基础进行开发,一般TCP通讯软件都分为服务器端和客户端两部分;TCP服务器端由1个侦听Socket和多个用于应答的Socket组成,每个应答Socket与客户端建立一对一的数据流通道;客户端程序只包含一个连接Socket,它在成功连接服务器后与某一个应答Socket进行一对一的数据通讯。

 

服务器端的建立:

1、  首先创建一个命名为Server的基于对话框的MFC工程,并创建简单界面如下:


2、在Server.cpp中的BOOL CServerApp::InitInstance()函数中添加:

      AfxSocketInit();//Socket初始化

3、创建基于CSocket的类CSocketListen用于侦听客户端发来的连接请求,并实现其OnAccept函数:

void CSocketListen::OnAccept(int nErrorCode)

{

    //侦听处理函数,处理客户区的连接申请

    CSocketClient* p =newCSocketClient;

    Accept(*p);

    //取出客户的信息并显示到对话框中(以下5句代码不是必须的)

    CString szIP;

    UINT nPort;

    p->GetPeerName(szIP, nPort);//

    CServerDlg* pDlg = (CServerDlg*)AfxGetMainWnd();

    pDlg->OnAccept(szIP, nPort);//

 

    CSocket::OnAccept(nErrorCode);

}

4、创建基于CSocket的类CSocketClient用于接收客户端发来的数据,并实现其OnReceive函数:

void CSocketClient::OnReceive(int nErrorCode)

{   //接收客户端发过来的数据

    WCHAR s[2048] = {0};

    CString szIP;

    UINT nPort;

    //int nLen = ReceiveFrom(s, sizeof(s), szIP, nPort);

    int nLen = Receive(s, sizeof(s));

    s[nLen] = '\0';

    //将接收到的客户端发来的信息显示到对话框中

    GetPeerName(szIP, nPort);

    CServerDlg* pDlg = (CServerDlg*)AfxGetMainWnd();

    pDlg->OnRecive(s, szIP, nPort);

 

    CSocket::OnReceive(nErrorCode);

}

 

5、  在ServerDlg.h中申明CSocketListen m_socket。

ServerDlg.cpp中的BOOL CServerDlg::OnInitDialog()中函数创建侦听Socket,并开始侦听:

//创建一个固定端口的服务器socket,用于接收客户端发来的数据(其中侦听端口的值可更改)

    if (!m_socket.Create(8881))

    {

        int nError =GetLastError();

        AfxMessageBox(_T("创建网络失败!"));

    }

    //开始侦听客户端发来的连接请求

m_socket.Listen();

6、 在CServerDlg类中添加两个函数OnAccept和OnRecive,分别用于在对话框中显示用户的连接请求信息和接收到的用户发来的信息。其实现如下:

void CServerDlg::OnRecive(LPCTSTR Text, CString szIP, UINT nPort)

{

    CString str;

    str.Format(_T("%s-%d:\r\n%s\r\n"),szIP,nPort, Text);

    int nLen = m_Text.GetWindowTextLength();

    m_Text.SetSel(nLen, -1);

    m_Text.ReplaceSel(str);

}

 

 

void CServerDlg::OnAccept(CString szIP, UINT nPort)

{

    CString str;

    str.Format(_T("%s-%d登录了。。~\r\n"),szIP,nPort);

    int nLen = m_Text.GetWindowTextLength();

    m_Text.SetSel(nLen, -1);

    m_Text.ReplaceSel(str);

}

客户端的建立:

1、  首先创建一个命名为Client的基于对话框的MFC工程,并创建简单界面如下:


2、在Client.cpp中的BOOL CClientApp::InitInstance()函数中添加:

      AfxSocketInit();//Socket初始化

3、在Client.cpp中的BOOL CClientDlg::OnInitDialog()函数中添加:

//创建一个客户区随机端口(这中方式利于客户区开多个随机端口)

    if (!m_socket.Create())

    {

        AfxMessageBox(_T("网络创建失败!"));

    }

    //连接服务器(服务器的IP号和端口号可根据具体情况更改)

    if (!m_socket.Connect(_T("172.24.4.193"),8881))

    {

        int nErr =GetLastError();

        AfxMessageBox(_T("连接网络失败,请检查网络设备是否连通!"));

    }

4、实现“发送”按钮的功能:

void CClientDlg::OnBnClickedOk()

{

    // TODO:  在此添加控件通知处理程序代码

    CString str;

    GetDlgItemText(IDC_INPUT, str);

    if (str.IsEmpty())

    {

        AfxMessageBox(_T("不能发送空文字!"));

    }

    m_socket.Send(str, str.GetLength()*2);//这里千万要注意了,由于send函数发送的字节

流,而MFC中采用的是UNICODE编码导致一个字符占用两个字节,故发送时应把长度翻倍。

    //CDialogEx::OnOK();

}

 

运行结果:




1 0