第一步:新建一个项目,项目类型为MFC,名称为:TCPServer。选择基于对话框,并且选择Windows套接字。然后直接点完成就OK。
IDC_PORT_SET 设置端口 重新设置端口
IDC_CLEAR_IN 清除 清除编辑框中的内容
IDCANCEL 关闭 关闭对话框
IDC_IN_INFO 接收框 接收客户端发送过来的数据
IDC_PORT_EDIT 设置框 端口设置框
第三步:添加类
添加一个新类CClientSocket
说明:此类用于服务器对当前Socket的连接操作。
选择“项目”-->“添加类”-->类别选择“MFC”-->模板选择“MFC类”-->基类选择“CSocket”
方法同上添加新类ClistenSocket
说明:此类用于当服务器面临多个连接时建立Socket连接队列。
第四步:添加及修改代码
修改
CClientSocket类
重载基类函数OnReceive,使用此函数接收Socket连接另一端发送的消息,修改程序的代码如下所示
void CClientSocket::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
((CTCPServerDlg*)(AfxGetApp()->m_pMainWnd))->GetSocketMsg(this);
CSocket::OnReceive(nErrorCode);
}
上面代码的作用是当有信息发送到时,调用主对话框类的GetSocketMsg函数进行信息的接收,由于用到类CTCPServerDlg,所以在文件ClientSocket.cpp首部加入如下头文件
<pre name="code" class="cpp">//ADD
#include"TCPServerDlg.h"
//ADD
重载过程如下:首先选择类视图选中CClientSocket类
修改ClistenSocket
重载基类函数OnAccept,并修改如下:
void CListenSocket::OnAccept(int nErrorCode)
{
CClientSocket* pSocket=new CClientSocket(); //声明一个ClientSocket实例
CTCPServerDlg* pMainWnd=((CTCPServerDlg*)(AfxGetApp()->m_pMainWnd ));
//如果开始接收Socket传来的数据
if(pMainWnd->m_pSocket->Accept(*pSocket))
{
pMainWnd->m_SocketList.AddTail(pSocket);//添加消息来源
pMainWnd->MessageBox(_T("监听到一个连接,服务器程序"));
}
else delete pSocket;//否则删除该消息来源
CSocket::OnAccept(nErrorCode);
}
//代码的作用是当有与该端口试图连接的Socket时,调用主对话框类的GetSocketMsg函数进行信息的接收
//代码解释:AfxGetApp()->m_pMainWnd获取主对话框指针
//AfxGetApp( )这个函数是全局函数,可以得到当前应用进程的指针
//ADD
#include "TCPServerDlg.h"//函数检验连接,并将其加入到程序维护的Socket连接队列中,由于用到类CServerSocketDlg
#include "ClientSocket.h"//CClientSocket,因此在文件ListenSocket.cpp首部加入
//ADD
修改CTCPServerDlg类
添加编辑框的变量
添加端口编辑框
在TCPServerDlg.h中添加如下定义
public:
void GetSocketMsg(CClientSocket* pSocket);
CPtrList m_SocketList;
CListenSocket* m_pSocket;
在
TCPServerDlg.h和TCPServerDlg.cpp首部添加如下头文件
#include "ListenSocket.h"
#include "ClientSocket.h"
首先双击端口设置按钮后在TCPServerDlg.cpp中添加如下代码
void CTCPServerDlg::OnBnClickedPortSet()
{
// TODO: 在此添加控件通知处理程序代码
m_pSocket=new CListenSocket;
UpdateData(TRUE);
if(m_pSocket->Create(m_PortSet))
{
if(!m_pSocket->Listen())
MessageBox(_T("端口设置错误,服务器程序"));
else MessageBox(_T("端口设置生效,服务器程序"));
}
}
双击清除按钮然后添加
void CTCPServerDlg::OnBnClickedClearIn()
{
// TODO: 在此添加控件通知处理程序代码
m_InInfo.Empty ();
UpdateData(FALSE);
}
双击退出按钮然后添加
void CTCPServerDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
if(m_pSocket) delete m_pSocket;
m_SocketList.RemoveAll();
OnCancel();
}
最后直接粘贴如下代码
void CTCPServerDlg::GetSocketMsg(CClientSocket* pSocket)
{
BOOL MsgEnd=FALSE;
CString Msg;
char MsgBuf[100];
int bufsize=100;
Msg.Empty();
do
{
strcpy(MsgBuf,"");
int left=pSocket->Receive(MsgBuf,bufsize);
if(left<100 && left>0) MsgEnd=TRUE;
MsgBuf[left]=0;
Msg+=MsgBuf;
}
while(!MsgEnd);
MessageBox(_T("接收到客户端信息"),_T("服务器程序"));
m_InInfo+=Msg;
UpdateData(FALSE);
}