void CMy Wc Dlg On Connect Update Datatrue

  • Slides: 34
Download presentation

建立与服务器的连接 void CMy. Wc. Dlg: : On. Connect() { Update. Data(true); //更新关联变量,如服务器名、端口号 if(!sock. Client.

建立与服务器的连接 void CMy. Wc. Dlg: : On. Connect() { Update. Data(true); //更新关联变量,如服务器名、端口号 if(!sock. Client. Create()) //1创建套接口 { Afx. Message. Box("Create WC socket failed"); Post. Quit. Message(0); } if(!sock. Client. Connect(m_server_name, m_n. Port))//2连接服务器 { Message. Box("连接失败!"); return; } m_Dat. m_b. Online=true; //标记连接成功 } 返回目录

向服务器发送数据 void CMy. Wc. Dlg: : On. Send() { Update. Data(true); //更新关联变量,如要发送的信息 m_Dat. m_b.

向服务器发送数据 void CMy. Wc. Dlg: : On. Send() { Update. Data(true); //更新关联变量,如要发送的信息 m_Dat. m_b. Online=true; memset(m_Dat. m_db. Data, 0, 255); memcpy(m_Dat. m_db. Data, m_send_info. Get. Length()); strcpy(m_Dat. m_str. Name, m_client_name); int i. Sent = sock. Client. Send(&m_Dat, sizeof(m_Dat)); //发送的信息 //如果发送成功,将其发送的信息添加并显示在列表编辑框 if(i. Sent != SOCKET_ERROR) { m_ctl. Sent. Add. String(m_send_info); Update. Data(false); // 显示更新 } } 返回目录

接受服务器发来的数据 1. 添加虚拟函数 用MFC Class. Wizard在CWCSock类中添加虚函数 On. Receive() 2. 读取服务器传来的数据,通知主窗口进行处理 void CWCSock: : On.

接受服务器发来的数据 1. 添加虚拟函数 用MFC Class. Wizard在CWCSock类中添加虚函数 On. Receive() 2. 读取服务器传来的数据,通知主窗口进行处理 void CWCSock: : On. Receive(int n. Error. Code) { if(Receive(&m_Dat, sizeof(m_Dat))==sizeof(m_Dat)) : : Post. Message(: : Afx. Get. App()->m_p. Main. Wnd->m_h. Wnd, RE_RECEIVED, (WPARAM)&m_Dat, 0); CSocket: : On. Receive(n. Error. Code); } 返回目录

处理自定义消息 1. 在WCSock. h中,定义自定义消息,以使CWCSock能够同 应用程序主窗口通信。 #define RE_RECEIVED WM_USER+1 2. 在 CMy. Wc. Dlg. cpp文

处理自定义消息 1. 在WCSock. h中,定义自定义消息,以使CWCSock能够同 应用程序主窗口通信。 #define RE_RECEIVED WM_USER+1 2. 在 CMy. Wc. Dlg. cpp文 件 中 , 添 加 消 息 映 射 宏 , 响 应 CWCSock类对象发送过来的自定义消息RE_RECEIVED BEGIN_MESSAGE_MAP(CMy. Wc. Dlg, CDialog) //{{AFX_MSG_MAP(CMy. Wc. Dlg) …… ON_BN_CLICKED(IDC_SEND, On. Send) ON_MESSAGE(RE_RECEIVED, On. Receive); //}}AFX_MSG_MAP END_MESSAGE_MAP() 返回目录

处理自定义消息(续一) 3.在CMy. Wc. Dlg类添加自定义函数On. My. Receive class CMy. Wc. Dlg : public CDialog {

处理自定义消息(续一) 3.在CMy. Wc. Dlg类添加自定义函数On. My. Receive class CMy. Wc. Dlg : public CDialog { public: CMy. Wc. Dlg(CWnd* p. Parent = NULL); CWCSock sock. Client; …… //自定义函数说明 LRESULT On. My. Receive(WPARAM wparam, LPARAM l. Param); …… 返回目录 }

处理自定义消息(续二) 4. 在CMy. Wc. Dlg类的实现文件中添加函数体 LRESULT CMy. Wc. Dlg: : On. My. Receive(WPARAM wparam,

处理自定义消息(续二) 4. 在CMy. Wc. Dlg类的实现文件中添加函数体 LRESULT CMy. Wc. Dlg: : On. My. Receive(WPARAM wparam, LPARAM l. Param) { _DATA *dat; dat = new _DATA; memcpy(dat, (_DATA *)wparam, sizeof(_DATA)); CString str = dat->m_str. Name; str += ": "; str += dat->m_db. Data; m_ctl. Recvd. Add. String(str); //将信息添加并显示在列表框中 Update. Data(false); //显示列表编辑框内容 delete dat; return 1; } 返回目录

处理控件的状态 1. 在On. Close()和On. Init. Dialog()函数中 Get. Dlg. Item(IDC_CONNECT)->Enable. Window(true); Get. Dlg. Item(IDC_SEND)->Enable. Window(false);

处理控件的状态 1. 在On. Close()和On. Init. Dialog()函数中 Get. Dlg. Item(IDC_CONNECT)->Enable. Window(true); Get. Dlg. Item(IDC_SEND)->Enable. Window(false); Get. Dlg. Item(IDC_CLOSE)->Enable. Window(false); Get. Dlg. Item(IDC_SERVER_PORT)->Enable. Window(true); Get. Dlg. Item(IDC_CLIENT_NAME)->Enable. Window(true); Get. Dlg. Item(IDC_SERVER_NAME)->Enable. Window(true); 返回目录

处理控件的状态(续) 2. 在On. Connect()函数中 Get. Dlg. Item(IDC_CONNECT)->Enable. Window(false); Get. Dlg. Item(IDC_SEND)->Enable. Window(true); Get. Dlg.

处理控件的状态(续) 2. 在On. Connect()函数中 Get. Dlg. Item(IDC_CONNECT)->Enable. Window(false); Get. Dlg. Item(IDC_SEND)->Enable. Window(true); Get. Dlg. Item(IDC_CLOSE)->Enable. Window(true); Get. Dlg. Item(IDC_SERVER_PORT)->Enable. Window(false); Get. Dlg. Item(IDC_CLIENT_NAME)->Enable. Window(false); Get. Dlg. Item(IDC_SERVER_NAME)->Enable. Window(false); 返回目录

返 回 读取客户的信息(续一) void CMy. Ws. Dlg: : Read. Message(CRWSock* sock) { int len

返 回 读取客户的信息(续一) void CMy. Ws. Dlg: : Read. Message(CRWSock* sock) { int len = sock->Receive(&m_Dat, sizeof(m_Dat)); _DATA *dat = &m_Dat; CString str = "收到客户机("; str += dat->m_str. Name; str += “)的信息:”; str += dat->m_db. Data; m_ctl. Recvd. Add. String(str); if(m_Dat. m_b. Online)Send. Message(sock, &m_Dat); else { sock->Close(); POSITION pos = m_list. Find(sock); m_list. Remove. At(pos); delete sock; } }

向在线的客户发送信息(续二) void CMy. Ws. Dlg: : Send. Message(CRWSock* socket, _DATA *buf) { POSITION pos

向在线的客户发送信息(续二) void CMy. Ws. Dlg: : Send. Message(CRWSock* socket, _DATA *buf) { POSITION pos = m_list. Get. Head. Position( ); while ( pos { != NULL) CRWSock *client =(CRWSock*)m_list. Get. Next(pos); if(client == socket)continue; client->Send(buf, sizeof(m_Dat)); } } 返 回

返回目录 处理客户的连接请求 1.在Cmy. Ws. Dlg类中,添加一个CPtr. List类的对 象,用于管理各个客户的套接口 CPtr. List m_list; 2.在CLSock类中添加虚拟函数On. Accept(),用 于处理客户的连接请求 void

返回目录 处理客户的连接请求 1.在Cmy. Ws. Dlg类中,添加一个CPtr. List类的对 象,用于管理各个客户的套接口 CPtr. List m_list; 2.在CLSock类中添加虚拟函数On. Accept(),用 于处理客户的连接请求 void CLSock: : On. Accept(int n. Error. Code) { ASSERT(m_p); m_p->Accept. Client(); CSocket: : On. Accept(n. Error. Code); } 转下页

处理客户的连接请求(续) 创建套接口, 添加到链表中 void CMy. Ws. Dlg: : Accept. Client() { m_client. Socket =

处理客户的连接请求(续) 创建套接口, 添加到链表中 void CMy. Ws. Dlg: : Accept. Client() { m_client. Socket = new CRWSock(this); if(!m_listen. Socket->Accept(*m_client. Socket)) { Afx. Message. Box("请求连接失败"); delete m_client. Socket; m_client. Socket=NULL; return; } m_list. Add. Tail(m_client. Socket); } 返 回

返回目录 启动服务器 void CMy. Ws. Dlg: : On. Start() { Update. Data(true); //①创建套接口 m_listen.

返回目录 启动服务器 void CMy. Ws. Dlg: : On. Start() { Update. Data(true); //①创建套接口 m_listen. Socket = new CLSock(this); if(!m_listen. Socket->Create(m_server_port)) { delete m_listen. Socket; m_listen. Socket=NULL; return; } //②进入侦听状态 if(!m_listen. Socket->Listen()) { delete m_listen. Socket; m_listen. Socket=NULL; return; } }

关闭服务器 返 回 void CMy. Ws. Dlg: : On. Close() { POSITION pos =

关闭服务器 返 回 void CMy. Ws. Dlg: : On. Close() { POSITION pos = m_list. Get. Head. Position(); while( pos != NULL )//①从套接口链表中删除所有结点 { CRWSock* client=(CRWSock*)m_list. Get. Next(pos); delete client; } if(m_listen. Socket != NULL)//②关闭读套接口 { m_listen. Socket->Close(); delete m_listen. Socket; } }

控件的状态更新 返回目录 1.在On. Start()函数中末添加如下控件的状态 更新语句: Get. Dlg. Item(IDC_START)->Enable. Window(false); Get. Dlg. Item(IDC_CLOSE)->Enable. Window(true); Get.

控件的状态更新 返回目录 1.在On. Start()函数中末添加如下控件的状态 更新语句: Get. Dlg. Item(IDC_START)->Enable. Window(false); Get. Dlg. Item(IDC_CLOSE)->Enable. Window(true); Get. Dlg. Item(IDC_SERVER_PORT)->Enable. Window(false); 2. 在 On. Close()和 On. Init. Dialog()函 数 中 末 添加如下控件的状态更新语句: Get. Dlg. Item(IDC_START)->Enable. Window(true); Get. Dlg. Item(IDC_CLOSE)->Enable. Window(false); Get. Dlg. Item(IDC_SERVER_PORT)->Enable. Window(true);