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

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值