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();
}
运行结果:
- MFC学习笔记之——>MFC下的TCP通信的建立
- MFC学习笔记——多窗口之间的通信 .
- MFC学习笔记——多窗口之间的通信
- MFC学习笔记——剪贴板通信
- MFC下多线程的建立
- MFC笔记:TCP Socket通信
- [MFC]TCP通信的简单实现
- MFC学习的笔记
- [每日一学]MFC学习笔记——多窗口之间的通信
- MFC 学习之 文件的建立与删除
- 深入浅出MFC学习笔记:MFC六大关键技术仿真之MFC程序的初始化过程
- MFC学习笔记-串口通信
- MFC菜单的建立
- MFC项目的建立
- MFC学习笔记(4)——Windows程序的类封装 下
- 学习MFC的消息通信问题
- MFC学习笔记三——MFC程序的初始化过程
- MFC学习笔记——状态栏(基于对话框的MFC程序)
- Derby 数据库的应用
- Android电视开发问题收集——在实际开发中遇到的问题及其解决方案
- iOS 8下设置cell的分割线缩进separatorInset
- HIVE快速入门
- leetcode-Linked List Cycle
- MFC学习笔记之——>MFC下的TCP通信的建立
- UI界面-表格布局
- ModelAndView详解
- Android编译系统详解(二)
- linux下c/c++总结
- Tomcat启动内存设置
- PHP编程效率的20个要点
- jquery 插件写法三
- Nginx 增加 SPDY 支持并测试