您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 基于VC++6.0-Socket编程操作实例
VC++6.0网络编程Socket编程作为一个初学者,深感Socket编程入门的困难,但当把一些问题弄懂之后,回过头来看以前遇到的一些问题,才发现Socket编程其实并没有那么复杂。接下来我就把我遇到的一些困难讲述下,并补上解决的办法。首先我们要想实现一个简单的点对点网络通信,就应该有一个客户和一个服务器我们先来做客户端。先按照如下图所示建立好客户对话框模块:首先创建一个基于MFCAppWizard[EXE]工程,工程名为Socket__002(这里是以我的工程名为准,你们也可以自己命名工程。)点击确定只收选择基本对话框,如图:点击下一步,在WindowsSockets[W]处钩上之后就点击【完成】。建立如图所示的客户端对话框:控件属性:说明:IDC_EDIT1端口号编辑框,IDC_EDIT3发送文本框,IDC_IPADDRESS1IPd地址框,IDC_LIST1列表框。现在模块已经建好了,接下来就是写代码了,不过写代码之前我们要先理清思路。客户端与服务器是怎样来实现通信的呢,其实就是由数据的发送者客户端将要发送的信息写入一个套接字,在通过中间环节传输到接收端服务器的套接字中,就可以由接收端的应用程序将套接字从中取出。因此,两个应用程序间的数据传输要通过套接字来完成,至于两个套接字间是怎么传输的我们就不要管了,我们只要把信息装入套接字中就可以了。作为一个客户端,应该具备以下功能:1,、向指定地址的服务器发送连接请求;2、向已经连接成功的服务器发送信息;3、主动断开与服务器的连接;当我们已经知道客户端的功能时就应该想到,我们该怎样用代码实现这些功能呢;当然对于初学者来说编写这些代码还有点困难,我们可以先参考网络上的资料把原理弄懂,这才是我写这篇文章的本意。VC6.0界面中的工作区点击ClassView选项卡,右击【Socket_002classes】-----【NewClass】添加新类“Client_Socket”基类为genericCWnd。右击CSocket_002Dlg为CSocket_002Dlg类添加共有成员变量m_StartC;为了使新建的类与对话框类有关联需要在Socket_002Dlg.h头文件中加入#include”ClientSocket.h”记住一定要放在第一行。在类定义的public中加入CClientSocketm_CClientSocket;同样的道理,在”ClientSocket.h”头文件里加入#include”Socket_002Dlg.h”为新添加的类Client_Socket添加成员函数OnConnect(),函数原型voidOnConnect(intnErrorCode)。在OnConnect()函数中添加如下代码:voidCClientSocket::OnConnect(intnErrorCode)//CAsyncSocket::OnConnect{if(nErrorCode){AfxMessageBox(连接失败,请你重试!);return;}((CSocket_002Dlg*)(AfxGetApp()-m_pMainWnd))-m_ListWords.AddString(连接服务器成功!);((CSocket_002Dlg*)(AfxGetApp()-m_pMainWnd))-m_ListWords.SetTopIndex(((CSocket_002Dlg*)(AfxGetApp()-m_pMainWnd))-m_ListWords.GetCount()-1);}接下来就是对对话框连接按钮创建单击函数,函数内容如下:voidCChat_ClientDlg::OnButton1(){//TODO:Addyourcontrolnotificationhandlercodehereif(!m_StartC){BYTEnFild[4];CStringsIP;UpdateData();m_ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);sIP.Format(%d.%d.%d.%d,nFild[0],nFild[1],nFild[2],nFild[3]);m_CClientSocket.Create();m_CClientSocket.Connect(sIP,m_sPort);m_StartC=~FALSE;}}断开按钮程序:voidCSocket_002Dlg::OnButton2(){//TODO:Addyourcontrolnotificationhandlercodeherem_CClientSocket.Close();m_ListWords.AddString(从服务器断开);m_StartC=FALSE;}发送按钮程序:voidCSocket_002Dlg::OnButton3(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData();m_CClientSocket.Send(m_sWords,m_sWords.GetLength());m_ListWords.AddString(发送:+m_sWords);m_ListWords.SetTopIndex(m_ListWords.GetCount()-1);}同时在CSocket_002Dlg::OnInitDialog()中加入如下所示代码BOOLCSocket_002Dlg::OnInitDialog(){……m_StartC=FALSE;……}服务器对话框Char_Server模块同客户端模块一样创建一个Char_Server的工程,服务器的功能:1、监听;2、接受客户端请求;3、停止监听;4、接收信息;原理同客户端设置基本类似创建两个类一个用来监听的类CListenSocket,一个用来接收信息的类CServerSocket,同样是以genericCWnd类为基类。在”Chat_ServerDlg.h”中添加#includeServerSocket.h#includeListenSocket.h再添加两个public成员变量CServerSocketm_ServerSocket;CListenSocketm_ListenSocket;接着分别在ServerSocket.h,ListenSocket.h头文件中加入include”Chat_ServerDlg.h”,注意include”Chat_ServerDlg.h”放置的位置,放在预编译之前,以防出错。服务器对话框控件属性设置:接下来就开始在创建好的CListenSocket类中添加成员函数voidOnAccept(intnErrorCode)具体怎么添加我就不做详细说了。成员函数代码如下:voidCListenSocket::OnAccept(intnErrorCode){Accept(((CCSock_ChatServerDlg*)(AfxGetApp()-m_pMainWnd))-m_ServerSocket);((CCSock_ChatServerDlg*)(AfxGetApp()-m_pMainWnd))-m_ServerSocket.AsyncSelect(FD_READ|FD_CLOSE);((CCSock_ChatServerDlg*)(AfxGetApp()-m_pMainWnd))-m_ListWords.AddString(接受了一个客户端的连接请求);((CCSock_ChatServerDlg*)(AfxGetApp()-m_pMainWnd))-m_ListWords.SetTopIndex(((CCSock_ChatServerDlg*)(AfxGetApp()-m_pMainWnd))-m_ListWords.GetCount()-1);}紧接着在CServerSocket类中添加两个成员函数:voidOnReceive(intnErrorCode),voidOnClose(intnErrorCode),代码如下:voidCServerSocket::OnReceive(intnErrorCode){charSzTemp[200];intn=Receive(SzTemp,200);SzTemp[n]='\0';CStringsTemp;sTemp.Format(收到:%s,SzTemp);((CCSock_ChatServerDlg*)(AfxGetApp()-m_pMainWnd))-m_ListWords.AddString(sTemp);((CCSock_ChatServerDlg*)(AfxGetApp()-m_pMainWnd))-m_ListWords.SetTopIndex(((CCSock_ChatServerDlg*)(AfxGetApp()-m_pMainWnd))-m_ListWords.GetCount()-1);}voidCServerSocket::OnClose(intnErrorCode){((CCSock_ChatServerDlg*)(AfxGetApp()-m_pMainWnd))-m_ListWords.AddString(客户端断开);((CCSock_ChatServerDlg*)(AfxGetApp()-m_pMainWnd))-m_ListWords.SetTopIndex(((CCSock_ChatServerDlg*)(AfxGetApp()-m_pMainWnd))-m_ListWords.GetCount()-1);Close();}接下来就可以运行了,运行结果如下:任务完成,若是有不明白的地方可以参考《VisualC++网络编程》----主编正阿奇;源码地址:
本文标题:基于VC++6.0-Socket编程操作实例
链接地址:https://www.777doc.com/doc-5864158 .html