Error[8]: Undefined offset: 395, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

  • :比较费工夫的一次实验,因为不熟悉VS的MFC程序开发流程;以此简单记录一下。
  • :仅为个人总结;如有错误,还望指教!
计算机网络实验八——聊天程序

HNU CS Computer Network Lab8

实验环境

Virtual Studio 2019

实验原理

详见实验指导书

实验步骤 0 环境搭建

也可直接下载旧版的VC++安装实验指导书完成,这里是本来就装了VS就懒得再下载了

1 创建工程

1、先建立一个MFC,选dialogBased,工程名为LX2 。


选择“高级功能”,选择“Window 套接字”

出现Dialog以后,编辑界面,并且对控件点击右键,选择属性选项,把每个控件的ID改掉(控件ID就是每个控件的名字,要改成有意义的,以便将来管理)。

并对控件添加系统变量如下:


允许文本框输入回车,文本框右键选择“属性”

2、再建立一个MFC,选dialogBased,工程名为LX1。


首先,在BOOL CLx1Dlg::OnInitDialog()和BOOL CLx2Dlg::OnInitDialog()末尾添加语句,使其如下所示:

m_send.EnableWindow(FALSE); //使发送按钮变灰

**注意:**这个语句作用使发送按钮失效,以免还未连接用户就点击发送,发生不可预计的错误。

2 添加类和函数

为了在自己程序里面更自由地处理CSocket得到的消息,必须新建CSocket的派生类:在lx2工程里工作区类视图里点右键,添加新类:CServer,父类为CSocket。


如上所示,在lx2Dlg.h里添加头文件#include "CServer.h"和private变量:CServer m_server; CServer m_recv在对话框的图象上双击“侦听”按钮,在里面添加如下代码,使其如下所示:

void Clx2Dlg::OnBnClickedListen()
{
	m_server.Create(1000);				//	使用1000号端口
	m_server.Listen();					//	侦听
}

在对话框图象上再双击“发送”按钮,添加代码,如下所示:

void Clx2Dlg::OnBnClickedSend()
{
	UpdateData(TRUE);		//更新数据,使m_msg得到当前框中文本
	m_recv.Send(m_msg, 4 * m_msg.GetLength());	 //发送数据
	m_ctrl.SetSel(0, -1);		//全选发送框文字
	m_ctrl.ReplaceSel(_T(""), TRUE);//将发送框置空
}

同样地,在Lx1工程里工作区类视图里右键,添加新类:CClient。继承自CSocket
在lx1Dlg.h里添加头文件#include "CClient.h"和private变量:CClient m_client;

双击对话框图象上的“连接”按钮,添加代码:

void Clx1Dlg::OnBnClickedConnect()
{
	UpdateData(TRUE);
	m_client.Create(1001);				//使用1001号端口
	if (m_client.Connect(m_ip, 1000))	//连接目标地址,1000端口
	{
		AfxMessageBox(_T("Client端连接成功"));
		m_send.EnableWindow(TRUE);			//连接成功,可以发送
		m_connect.EnableWindow(FALSE);		//同时禁止连接按钮
	}
	else
	{
		m_client.Close();					//如果连接失败就关闭
		AfxMessageBox(_T("连接失败"));
	}
}

双击发送按钮,添加代码:

void Clx1Dlg::OnBnClickedSend()
{
	UpdateData(TRUE);			//更新数据,使m_msg得到当前框中文本
	m_client.Send(m_msg,4 * m_msg.GetLength());		//发送数据
}

以上这些 *** 作,已经将CSocket的建立,以及主机,客户机建立连接后的消息发送代码添加完成了,但是还缺少使其工作的消息机制。

下面的步骤就是利用OnAccept和OnReceive函数处理socket消息。

首先,在lx2工程的编辑界面点右键,选Class Wizard,在classname栏目里面找到CServer类,添加OnAccept和OnReceive函数并且双击下面的Member function栏目,分别为两个函数添加代码。

在CSever.cpp中添加头文件#include "lx2Dlg.h"
添加OnAccept函数的代码:

void CSever::OnAccept(int nErrorCode)
{
	CSocket::OnAccept(nErrorCode);
	((Clx2Dlg*)(AfxGetApp()->m_pMainWnd))->ShowAccept();
}

这步以后,可以为Clx2Dlg类里添加public成员函数ShowAccept():

void Clx2Dlg::ShowAccept()
{
	m_server.Accept(m_recv);
	AfxMessageBox(_T("Server端连接成功"));
	m_send.EnableWindow(TRUE);			//	连接成功,可以发送
	m_listen.EnableWindow(FALSE);		//	同时禁止侦听按钮
}


于是,当客户机调用m_client.Connect(m_ip,1000);这句时,主机server端发现,并调用ShowAccept函数来建立连接。执行完以后,Socket连接便被建立。

接下来的工作便是添加发送聊天信息的函数了。

注意到前面点击发送按钮的OnSend() 函数已经添加好了,在lx2工程中只要添加Server端的接收消息和显示消息功能就可以进行消息的传送。
添加OnReceive函数的代码:

void CSever::OnReceive(int nErrorCode)
{
	CSocket::OnReceive(nErrorCode);
	((Clx2Dlg*)(AfxGetApp()->m_pMainWnd))->ShowMsg();
}

建立连接后,一方一旦发送数据,另一方的CSocket派生类便调用这个函数。其中代码可以参考前面OnAccept() 进行理解。
在Clx2Dlg里添加成员函数ShowMsg():

void Clx2Dlg::ShowMsg()
{
	wchar_t buf[1024] = { '}' ;//声明为wchar_t类型!!!为了这个bug,我调了两个小时!哭晕了					int
	= len . m_recvReceive(,buf1024 );//接收消息到buf里面,长度1024字节。			AfxMessageBox
	()buf;//用AfxMessageBox函数显示接收到的字符窜。								}
#include "lx1Dlg.h"

同样在lx1工程中也如此这般添加消息接收函数:

在CSever.cpp中添加头文件void
添加OnReceive函数的代码:

CClient ::OnReceive(int) nErrorCodeCSocket
{
	::OnReceive()nErrorCode;(
	(*Clx1Dlg)(AfxGetApp())->m_pMainWnd)ShowMsg->();}
void

在Clx2Dlg里添加成员函数ShowMsg():

Clx1Dlg ::ShowMsg()wchar_t
{
	[ buf1024]= '}' { ; //声明为wchar_t类型!!!int					=
	. len Receive m_client(,1024buf) ;//接收消息到buf里面,长度1024字节。AfxMessageBox			(
	);buf//用AfxMessageBox函数显示接收到的字符窜。}								void
Clx1Dlg

对于lx1和lx2工程,在对话框销毁的时候,关闭Socket连接,释放资源。

:: PostNcDestroy()CDialogEx::
{
	PostNcDestroy();.Close
	m_client();}void
Clx2Dlg
:: PostNcDestroy()CDialogEx::
{
	PostNcDestroy();.Close
	m_server();.Close
	m_recv();}
  • 1、2就是上面两个工程的组合
  • 蹲一个 3 的实现 ( 实在不想写了:( )
  • 代码全部添加完毕。

    3 运行测试

    在两个vc中分别按下F5键,编译执行两个程序,就可以进行通信了。
    程序运行过程如下:
    1、在Lx2中按下侦听。
    2、在Lx1中输入地址后按下连接。
    3、 在Lx1的文本框内输入字符,按下发送,则Lx2端便会得到来自Lx1的消息。
    4、在Lx2的文本框内输入字符,按下发送,则Lx1端便会得到来自Lx2的消息,同时Lx2的文本框会自动清空。


    思考题

    1、 改造程序结构:上面这个程序能做到双向发送消息。但是在这里,两个程序必须成对使用,即一个是Server端,一个是Client端。而真正实用的聊天程序即使使用了Client/Server模式,也必须将其整合,使其所有的功能都在一个程序中实现,以增加适用性。试改造结构,将两个程序的功能整合一起。界面参见第二题。

    2、 添加程序功能,有以下几点可供参考:
    用AfxMessageBox(…)显示消息显得不够专业,可以考虑制作一个双文本框的界面,让发送的消息在下面一个文本框中输入,接收的消息在上面的文本框中显示。
    可以考虑在显示的文本框中添加滚动条让消息可以往下滚动。
    增加保存聊天记录的功能。

    3、此实验为了简单易 *** 作,直接利用了CSocket类的Send和Receive进行通信。请参照实验原理部分的CSocketFile类和CArchive类的说明以及通信的流程图对其进行改造,以便更方便、高效地进行大量数据交换。

      [+++][+++]
    )
    File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
    File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
    File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
    Error[8]: Undefined offset: 396, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
    File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

    • :比较费工夫的一次实验,因为不熟悉VS的MFC程序开发流程;以此简单记录一下。
    • :仅为个人总结;如有错误,还望指教!
    计算机网络实验八——聊天程序

    HNU CS Computer Network Lab8

    实验环境

    Virtual Studio 2019

    实验原理

    详见实验指导书

    实验步骤 0 环境搭建

    也可直接下载旧版的VC++安装实验指导书完成,这里是本来就装了VS就懒得再下载了

    1 创建工程

    1、先建立一个MFC,选dialogBased,工程名为LX2 。


    选择“高级功能”,选择“Window 套接字”

    出现Dialog以后,编辑界面,并且对控件点击右键,选择属性选项,把每个控件的ID改掉(控件ID就是每个控件的名字,要改成有意义的,以便将来管理)。

    并对控件添加系统变量如下:


    允许文本框输入回车,文本框右键选择“属性”

    2、再建立一个MFC,选dialogBased,工程名为LX1。


    首先,在BOOL CLx1Dlg::OnInitDialog()和BOOL CLx2Dlg::OnInitDialog()末尾添加语句,使其如下所示:

    m_send.EnableWindow(FALSE); //使发送按钮变灰
    

    **注意:**这个语句作用使发送按钮失效,以免还未连接用户就点击发送,发生不可预计的错误。

    2 添加类和函数

    为了在自己程序里面更自由地处理CSocket得到的消息,必须新建CSocket的派生类:在lx2工程里工作区类视图里点右键,添加新类:CServer,父类为CSocket。


    如上所示,在lx2Dlg.h里添加头文件#include "CServer.h"和private变量:CServer m_server; CServer m_recv在对话框的图象上双击“侦听”按钮,在里面添加如下代码,使其如下所示:

    void Clx2Dlg::OnBnClickedListen()
    {
    	m_server.Create(1000);				//	使用1000号端口
    	m_server.Listen();					//	侦听
    }
    

    在对话框图象上再双击“发送”按钮,添加代码,如下所示:

    void Clx2Dlg::OnBnClickedSend()
    {
    	UpdateData(TRUE);		//更新数据,使m_msg得到当前框中文本
    	m_recv.Send(m_msg, 4 * m_msg.GetLength());	 //发送数据
    	m_ctrl.SetSel(0, -1);		//全选发送框文字
    	m_ctrl.ReplaceSel(_T(""), TRUE);//将发送框置空
    }
    

    同样地,在Lx1工程里工作区类视图里右键,添加新类:CClient。继承自CSocket
    在lx1Dlg.h里添加头文件#include "CClient.h"和private变量:CClient m_client;

    双击对话框图象上的“连接”按钮,添加代码:

    void Clx1Dlg::OnBnClickedConnect()
    {
    	UpdateData(TRUE);
    	m_client.Create(1001);				//使用1001号端口
    	if (m_client.Connect(m_ip, 1000))	//连接目标地址,1000端口
    	{
    		AfxMessageBox(_T("Client端连接成功"));
    		m_send.EnableWindow(TRUE);			//连接成功,可以发送
    		m_connect.EnableWindow(FALSE);		//同时禁止连接按钮
    	}
    	else
    	{
    		m_client.Close();					//如果连接失败就关闭
    		AfxMessageBox(_T("连接失败"));
    	}
    }
    

    双击发送按钮,添加代码:

    void Clx1Dlg::OnBnClickedSend()
    {
    	UpdateData(TRUE);			//更新数据,使m_msg得到当前框中文本
    	m_client.Send(m_msg,4 * m_msg.GetLength());		//发送数据
    }
    

    以上这些 *** 作,已经将CSocket的建立,以及主机,客户机建立连接后的消息发送代码添加完成了,但是还缺少使其工作的消息机制。

    下面的步骤就是利用OnAccept和OnReceive函数处理socket消息。

    首先,在lx2工程的编辑界面点右键,选Class Wizard,在classname栏目里面找到CServer类,添加OnAccept和OnReceive函数并且双击下面的Member function栏目,分别为两个函数添加代码。

    在CSever.cpp中添加头文件#include "lx2Dlg.h"
    添加OnAccept函数的代码:

    void CSever::OnAccept(int nErrorCode)
    {
    	CSocket::OnAccept(nErrorCode);
    	((Clx2Dlg*)(AfxGetApp()->m_pMainWnd))->ShowAccept();
    }
    

    这步以后,可以为Clx2Dlg类里添加public成员函数ShowAccept():

    void Clx2Dlg::ShowAccept()
    {
    	m_server.Accept(m_recv);
    	AfxMessageBox(_T("Server端连接成功"));
    	m_send.EnableWindow(TRUE);			//	连接成功,可以发送
    	m_listen.EnableWindow(FALSE);		//	同时禁止侦听按钮
    }
    


    于是,当客户机调用m_client.Connect(m_ip,1000);这句时,主机server端发现,并调用ShowAccept函数来建立连接。执行完以后,Socket连接便被建立。

    接下来的工作便是添加发送聊天信息的函数了。

    注意到前面点击发送按钮的OnSend() 函数已经添加好了,在lx2工程中只要添加Server端的接收消息和显示消息功能就可以进行消息的传送。
    添加OnReceive函数的代码:

    void CSever::OnReceive(int nErrorCode)
    {
    	CSocket::OnReceive(nErrorCode);
    	((Clx2Dlg*)(AfxGetApp()->m_pMainWnd))->ShowMsg();
    }
    

    建立连接后,一方一旦发送数据,另一方的CSocket派生类便调用这个函数。其中代码可以参考前面OnAccept() 进行理解。
    在Clx2Dlg里添加成员函数ShowMsg():

    void Clx2Dlg::ShowMsg()
    {
    	wchar_t buf[1024] = { '}' ;//声明为wchar_t类型!!!为了这个bug,我调了两个小时!哭晕了					int
    	= len . m_recvReceive(,buf1024 );//接收消息到buf里面,长度1024字节。			AfxMessageBox
    	()buf;//用AfxMessageBox函数显示接收到的字符窜。								}
    #include "lx1Dlg.h"
    

    同样在lx1工程中也如此这般添加消息接收函数:

    在CSever.cpp中添加头文件void
    添加OnReceive函数的代码:

    CClient ::OnReceive(int) nErrorCodeCSocket
    {
    	::OnReceive()nErrorCode;(
    	(*Clx1Dlg)(AfxGetApp())->m_pMainWnd)ShowMsg->();}
    void
    

    在Clx2Dlg里添加成员函数ShowMsg():

    Clx1Dlg ::ShowMsg()wchar_t
    {
    	[ buf1024]= '}' { ; //声明为wchar_t类型!!!int					=
    	. len Receive m_client(,1024buf) ;//接收消息到buf里面,长度1024字节。AfxMessageBox			(
    	);buf//用AfxMessageBox函数显示接收到的字符窜。}								void
    Clx1Dlg
    

    对于lx1和lx2工程,在对话框销毁的时候,关闭Socket连接,释放资源。

    :: PostNcDestroy()CDialogEx::
    {
    	PostNcDestroy();.Close
    	m_client();}void
    Clx2Dlg
    :: PostNcDestroy()CDialogEx::
    {
    	PostNcDestroy();.Close
    	m_server();.Close
    	m_recv();}
  • 1、2就是上面两个工程的组合
  • 蹲一个 3 的实现 ( 实在不想写了:( )
  • 代码全部添加完毕。

    3 运行测试

    在两个vc中分别按下F5键,编译执行两个程序,就可以进行通信了。
    程序运行过程如下:
    1、在Lx2中按下侦听。
    2、在Lx1中输入地址后按下连接。
    3、 在Lx1的文本框内输入字符,按下发送,则Lx2端便会得到来自Lx1的消息。
    4、在Lx2的文本框内输入字符,按下发送,则Lx1端便会得到来自Lx2的消息,同时Lx2的文本框会自动清空。


    思考题

    1、 改造程序结构:上面这个程序能做到双向发送消息。但是在这里,两个程序必须成对使用,即一个是Server端,一个是Client端。而真正实用的聊天程序即使使用了Client/Server模式,也必须将其整合,使其所有的功能都在一个程序中实现,以增加适用性。试改造结构,将两个程序的功能整合一起。界面参见第二题。

    2、 添加程序功能,有以下几点可供参考:
    用AfxMessageBox(…)显示消息显得不够专业,可以考虑制作一个双文本框的界面,让发送的消息在下面一个文本框中输入,接收的消息在上面的文本框中显示。
    可以考虑在显示的文本框中添加滚动条让消息可以往下滚动。
    增加保存聊天记录的功能。

    3、此实验为了简单易 *** 作,直接利用了CSocket类的Send和Receive进行通信。请参照实验原理部分的CSocketFile类和CArchive类的说明以及通信的流程图对其进行改造,以便更方便、高效地进行大量数据交换。

      [+++]
    )
    File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
    File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
    File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
    计算机网络实验八——聊天程序_C_内存溢出

    计算机网络实验八——聊天程序

    计算机网络实验八——聊天程序,第1张

    • :比较费工夫的一次实验,因为不熟悉VS的MFC程序开发流程;以此简单记录一下。
    • :仅为个人总结;如有错误,还望指教!
    计算机网络实验八——聊天程序

    HNU CS Computer Network Lab8

    实验环境

    Virtual Studio 2019

    实验原理

    详见实验指导书

    实验步骤 0 环境搭建
    • 下载Visual Studio 2019
    • 安装MFC应用程序开发插件

    也可直接下载旧版的VC++安装实验指导书完成,这里是本来就装了VS就懒得再下载了

    1 创建工程

    1、先建立一个MFC,选dialogBased,工程名为LX2 。


    选择“高级功能”,选择“Window 套接字”

    出现Dialog以后,编辑界面,并且对控件点击右键,选择属性选项,把每个控件的ID改掉(控件ID就是每个控件的名字,要改成有意义的,以便将来管理)。

    并对控件添加系统变量如下:


    允许文本框输入回车,文本框右键选择“属性”

    2、再建立一个MFC,选dialogBased,工程名为LX1。


    首先,在BOOL CLx1Dlg::OnInitDialog()和BOOL CLx2Dlg::OnInitDialog()末尾添加语句,使其如下所示:

    m_send.EnableWindow(FALSE); //使发送按钮变灰
    

    **注意:**这个语句作用使发送按钮失效,以免还未连接用户就点击发送,发生不可预计的错误。

    2 添加类和函数

    为了在自己程序里面更自由地处理CSocket得到的消息,必须新建CSocket的派生类:在lx2工程里工作区类视图里点右键,添加新类:CServer,父类为CSocket。


    如上所示,在lx2Dlg.h里添加头文件#include "CServer.h"和private变量:CServer m_server; CServer m_recv在对话框的图象上双击“侦听”按钮,在里面添加如下代码,使其如下所示:

    void Clx2Dlg::OnBnClickedListen()
    {
    	m_server.Create(1000);				//	使用1000号端口
    	m_server.Listen();					//	侦听
    }
    

    在对话框图象上再双击“发送”按钮,添加代码,如下所示:

    void Clx2Dlg::OnBnClickedSend()
    {
    	UpdateData(TRUE);		//更新数据,使m_msg得到当前框中文本
    	m_recv.Send(m_msg, 4 * m_msg.GetLength());	 //发送数据
    	m_ctrl.SetSel(0, -1);		//全选发送框文字
    	m_ctrl.ReplaceSel(_T(""), TRUE);//将发送框置空
    }
    

    同样地,在Lx1工程里工作区类视图里右键,添加新类:CClient。继承自CSocket
    在lx1Dlg.h里添加头文件#include "CClient.h"和private变量:CClient m_client;

    双击对话框图象上的“连接”按钮,添加代码:

    void Clx1Dlg::OnBnClickedConnect()
    {
    	UpdateData(TRUE);
    	m_client.Create(1001);				//使用1001号端口
    	if (m_client.Connect(m_ip, 1000))	//连接目标地址,1000端口
    	{
    		AfxMessageBox(_T("Client端连接成功"));
    		m_send.EnableWindow(TRUE);			//连接成功,可以发送
    		m_connect.EnableWindow(FALSE);		//同时禁止连接按钮
    	}
    	else
    	{
    		m_client.Close();					//如果连接失败就关闭
    		AfxMessageBox(_T("连接失败"));
    	}
    }
    

    双击发送按钮,添加代码:

    void Clx1Dlg::OnBnClickedSend()
    {
    	UpdateData(TRUE);			//更新数据,使m_msg得到当前框中文本
    	m_client.Send(m_msg,4 * m_msg.GetLength());		//发送数据
    }
    

    以上这些 *** 作,已经将CSocket的建立,以及主机,客户机建立连接后的消息发送代码添加完成了,但是还缺少使其工作的消息机制。

    下面的步骤就是利用OnAccept和OnReceive函数处理socket消息。

    首先,在lx2工程的编辑界面点右键,选Class Wizard,在classname栏目里面找到CServer类,添加OnAccept和OnReceive函数并且双击下面的Member function栏目,分别为两个函数添加代码。

    在CSever.cpp中添加头文件#include "lx2Dlg.h"
    添加OnAccept函数的代码:

    void CSever::OnAccept(int nErrorCode)
    {
    	CSocket::OnAccept(nErrorCode);
    	((Clx2Dlg*)(AfxGetApp()->m_pMainWnd))->ShowAccept();
    }
    

    这步以后,可以为Clx2Dlg类里添加public成员函数ShowAccept():

    void Clx2Dlg::ShowAccept()
    {
    	m_server.Accept(m_recv);
    	AfxMessageBox(_T("Server端连接成功"));
    	m_send.EnableWindow(TRUE);			//	连接成功,可以发送
    	m_listen.EnableWindow(FALSE);		//	同时禁止侦听按钮
    }
    


    于是,当客户机调用m_client.Connect(m_ip,1000);这句时,主机server端发现,并调用ShowAccept函数来建立连接。执行完以后,Socket连接便被建立。

    接下来的工作便是添加发送聊天信息的函数了。

    注意到前面点击发送按钮的OnSend() 函数已经添加好了,在lx2工程中只要添加Server端的接收消息和显示消息功能就可以进行消息的传送。
    添加OnReceive函数的代码:

    void CSever::OnReceive(int nErrorCode)
    {
    	CSocket::OnReceive(nErrorCode);
    	((Clx2Dlg*)(AfxGetApp()->m_pMainWnd))->ShowMsg();
    }
    

    建立连接后,一方一旦发送数据,另一方的CSocket派生类便调用这个函数。其中代码可以参考前面OnAccept() 进行理解。
    在Clx2Dlg里添加成员函数ShowMsg():

    void Clx2Dlg::ShowMsg()
    {
    	wchar_t buf[1024] = { '}' ;//声明为wchar_t类型!!!为了这个bug,我调了两个小时!哭晕了					int
    	= len . m_recvReceive(,buf1024 );//接收消息到buf里面,长度1024字节。			AfxMessageBox
    	()buf;//用AfxMessageBox函数显示接收到的字符窜。								}
    #include "lx1Dlg.h"
    

    同样在lx1工程中也如此这般添加消息接收函数:

    在CSever.cpp中添加头文件void
    添加OnReceive函数的代码:

    CClient ::OnReceive(int) nErrorCodeCSocket
    {
    	::OnReceive()nErrorCode;(
    	(*Clx1Dlg)(AfxGetApp())->m_pMainWnd)ShowMsg->();}
    void
    

    在Clx2Dlg里添加成员函数ShowMsg():

    Clx1Dlg ::ShowMsg()wchar_t
    {
    	[ buf1024]= '}' { ; //声明为wchar_t类型!!!int					=
    	. len Receive m_client(,1024buf) ;//接收消息到buf里面,长度1024字节。AfxMessageBox			(
    	);buf//用AfxMessageBox函数显示接收到的字符窜。}								void
    Clx1Dlg
    

    对于lx1和lx2工程,在对话框销毁的时候,关闭Socket连接,释放资源。

    :: PostNcDestroy()CDialogEx::
    {
    	PostNcDestroy();.Close
    	m_client();}void
    Clx2Dlg
    :: PostNcDestroy()CDialogEx::
    {
    	PostNcDestroy();.Close
    	m_server();.Close
    	m_recv();}
  • 1、2就是上面两个工程的组合
  • 蹲一个 3 的实现 ( 实在不想写了:( )
  • 代码全部添加完毕。

    3 运行测试

    在两个vc中分别按下F5键,编译执行两个程序,就可以进行通信了。
    程序运行过程如下:
    1、在Lx2中按下侦听。
    2、在Lx1中输入地址后按下连接。
    3、 在Lx1的文本框内输入字符,按下发送,则Lx2端便会得到来自Lx1的消息。
    4、在Lx2的文本框内输入字符,按下发送,则Lx1端便会得到来自Lx2的消息,同时Lx2的文本框会自动清空。


    思考题

    1、 改造程序结构:上面这个程序能做到双向发送消息。但是在这里,两个程序必须成对使用,即一个是Server端,一个是Client端。而真正实用的聊天程序即使使用了Client/Server模式,也必须将其整合,使其所有的功能都在一个程序中实现,以增加适用性。试改造结构,将两个程序的功能整合一起。界面参见第二题。

    2、 添加程序功能,有以下几点可供参考:
    用AfxMessageBox(…)显示消息显得不够专业,可以考虑制作一个双文本框的界面,让发送的消息在下面一个文本框中输入,接收的消息在上面的文本框中显示。
    可以考虑在显示的文本框中添加滚动条让消息可以往下滚动。
    增加保存聊天记录的功能。

    3、此实验为了简单易 *** 作,直接利用了CSocket类的Send和Receive进行通信。请参照实验原理部分的CSocketFile类和CArchive类的说明以及通信的流程图对其进行改造,以便更方便、高效地进行大量数据交换。

      欢迎分享,转载请注明来源:内存溢出

      原文地址: http://outofmemory.cn/langs/914587.html

      (0)
      打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
      上一篇 2022-05-16
      下一篇 2022-05-16

      发表评论

      登录后才能评论

      评论列表(0条)

      保存