1、连接确认是当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的信息发送给客户端,一旦客户端确认了此连接,连接即可建立。而服务器端继续处于监听状态,继续接收其他客户端的连接请求。通过标准框架编写TCP服务器与客户端合成的工程软件步骤:客户端程序包括程序文件client.asm和资源文件client.rc。资源文件确定了客户端的界面形式。服务器端程序包括程序文件server.asm和资源文件server.rc。资源文件确定了服务器端的界面形式。在以下两个头文件ServerSocket.h:ClientSocket.h:中加入服
2、务器窗体的对象指针CTransFileDlg* m_pDlg;在ServerSocket.cpp文件中函数void CServerSocket:OnAccept(int nErrorCode) m_pDlg-AcceptConnection(); 为接到TCP客户端CONNECT 请求后服务器自动执行的相应函数。OnReceive(int nErrorCode) ReceiveData();为接到TCP客户端SEND发送的数据后,服务器自动执行的接收函数。在ClientSocket.cpp文件中函数void CClientSocket:SendFileData();为接到TCP服务器SEND发
3、送的数据后,客户端自动执行的接收函数。在TransFileDlg.h(对话框的类头文件)定义:CServerSocket* m_pServerSock; / 为负责服务器监听和响应客户端连接请求的SOCKET对象指针。CServerSocket* m_ServerSock; / 为负责和客户端进行数据通信(RECEIVE、SEND)SOCKET对象指针。CClientSocket* m_pSendSock; / 为负责客户端向服务器端发起连接请求,连接成功后又通过它和服务器建立通信链路(SEND,RECEIVE)进行发送和接收。在文件TransFileDlg.cpp 中 BOOL CTrans
4、FileDlg:OnInitDialog() 窗体初始化函数加入 m_pServerSock = new CServerSocket(this); /创建指针 m_ServerSock = new CServerSocket(this); m_pSendSock = new CClientSocket(this); m_pServerSock-Create(SERVERPORT); /服务器SOCKET绑定 m_pSendSock-Create(CLIENTPORT); /客户端SOCKET绑定 if (!m_pServerSock-Listen() / 服务器开始监听 MessageBox(
5、监听失败);在本事件(发送按钮)激发函数中建立客户端向服务器的连接,并发送数据。void CTransFileDlg:OnButtontrans() if (m_Send=FALSE) Close(); m_pSendSock- if (!m_pSendSock-Connect(host,SERVERPORT) int aa = m_pSendSock-GetLastError(); m_SendFile.Close(); m_pSendSock- MessageBox(连接失败 m_Send = FALSE; return; SetTimer(1,2000,NULL); /发送文件信息 m_
6、SendNum = 0;Send(fileinfo,MAX_PATH+4); m_SendLen = 0; LocalFree(fileinfo); else当前发送任务没有完成本函数实现服务器相应客户端的连接,并创建和客户端通信的通路:AcceptConnection() m_ServerSock-Accept(*m_ServerSock);服务器接收到数据后的对应处理函数:ReceiveData()客户端接收到数据后的对应处理函数:SendFileData()下面是我对部分源程序的分析:客服端程序:ClientDlg.cpp:#include stdafx.hClient.hClientD
7、lg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifpMysocket = new CMysocket(this); /创建套接字对象if (!pMysocket-Create() /创建套接字 delete pMysocket; MessageBox(套接字创建失败. return false; return TRUE;void CClientDlg:OnSysCommand(UINT nID, LPARAM lParam) if (nID & 0xFFF0) =
8、 IDM_ABOUTBOX) CAboutDlg dlgAbout; dlgAbout.DoModal(); CDialog:OnSysCommand(nID, lParam); char buffer200; /接收传来的数据 int factdata = pMysocket-Receive(buffer,200); bufferfactdata = 0; CString str; str.Format(%s,buffer); SetDlgItemText(IDC_EDIT4,str);OnButtonjoin() /点击连接 / TODO: Add your control notific
9、ation handler code here UpdateData(true); CString servername = m_servername; /读取服务器名称 int port; port = 70; /获取端口 if(!Connect(servername,port) /连接服务器,如果没有连接到服务器名称、端口号,连接服务器失败连接服务器失败! return;%s-,m_name,进入聊天室/打出字 昵称 进入聊天室 pMysocket-Send(str.GetBuffer(0),str.GetLength(); GetDlgItem(IDC_BUTTONJOIN)-Enabl
10、eWindow(FALSE);OnButton2() /点击发送CString str,temp,str1;m_info.GetWindowText(str);if(str.IsEmpty()|m_name.IsEmpty()return;temp.Format(%s说: %s,m_name,str);Send(str.GetBuffer(str.GetLength(),str.GetLength();Mysocket.cpp:void CMysocket: if (pClientdlg) pClientdlg-/调用主对话框的ReceiveData方法接收数据CSocket:OnReceiv
11、e(nErrorCode);服务端程序:ServerDlg.cpp :Server.hServerDlg.hvoid CServerDlg:AcceptConnect()/服务器接受客户端的连接 CClientSocket* socket = new CClientSocket(this);/创建与客户端通信的端口 if (m_pSocket-Accept(*socket)/如果SOCKET对象指针接受这个端口,则响应客户端连接请求 delete socket;OnButton1() /点击监听 m_pSocket = new CServerSocket(this);/负责服务器监听的sock
12、et对象指针=创建套接字m_pSocket-Create(70)/创建的端口!=70套接字创建失败 delete m_pSocket; m_pSocket = NULL;Listen()/如果没有连接到listen函数,则监听失败ReceiveData(CClientSocket* socket) CString str_ii; char bufferdata200;/创建缓存 /接收客户端传来的数据 int result = socket-Receive(bufferdata,200); bufferdataresult = 0;,bufferdata); SetDlgItemText(IDC_EDIT1,str);/在编辑框显示接收的数据ServerSocket.cpp :OnAccept(int nErrorCode) /接到TCP客户端CONNECT 请求后服务器自动执行接受连接函数 CSocket:OnAccept(nErrorCode); if (m_pDlg)/服务器窗体的对象指针 m_pDlg-AcceptConnect();利用两台电脑分别作为客户端和服务端分别运行程序,编译无错误后。在Dos环境下,客户端输入telent服务端IP,请求连接,服务端响应后。客户端就可以访问服务端。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2