VC2005—Socket(TCP/IP)服务端一步一步详细教程

来源:互联网 发布:济南东站到济南站源码 编辑:程序博客网 时间:2024/06/02 13:26

第一步:新建一个项目,项目类型为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);}





0 0
原创粉丝点击