dlg->m_button1.EnableWindow(TRUE);//设定发送按钮为可用状态 dlg->SetForegroundWindow(); while(s!=SOCKET_ERROR && dlg->ee!=0) //循环获得数据 { s=recv(dlg->clisock,buff,100,0); //调用recv函数接收数据 dlg->SetForegroundWindow(); if (s!=SOCKET_ERROR && dlg->ee!=0)//如果没有发生错误,同时没有断开连接,则显示接收到的数据 dlg->m_list.InsertItem(dlg->count++,buff); dlg->m_list.Scroll(size); } send(dlg->clisock,\如果发生错误,发送断开命令 dlg->m_button1.EnableWindow(FALSE);//设定相关控件属性 dlg->m_connect.EnableWindow(TRUE); dlg->m_disconnect.EnableWindow(FALSE); closesocket(dlg->clisock);//关闭SOCKET AfxEndThread(0);//终止该线程 return 0; } 3、 数据发送 数据发送就是客户端向服务器及其他客户端发送信息,其中向其他用户发送信息是通过服务器实现的,因此,客户只需要将消息发送到服务器就可以了。 //用户单击发送按扭,发送信息 void CCSocketcliDlg::OnButton1() { char buff[100]; CSize size; size.cx=0; size.cy=30; m_edit.GetWindowText(buff,99); //获得发送信息 m_edit.SetWindowText(\ m_list.InsertItem(count++,buff); m_list.Scroll(size); send(clisock,buff,100,0); //发送数据 } 五、执行结果及其分析。 1、开启服务器端聊天程序。
附件: 您所在的用户组无法下载或查看附件
图一:创建服务器端(提示:服务器创建成功)
服务器端创建成功,并自动绑定了服务器的IP。等待客户端的连接请求,此时的发送按扭是不可用的,当有客户端连接上时发送按扭就变为可用。在下面的编辑框里输入信息就可以发送了。
附件: 您所在的用户组无法下载或查看附件
图二:有客户端连接成功(IP地址为服务器地址)
附件: 您所在的用户组无法下载或查看附件
图三:服务器端发送“你好”并接受“客户端回复”两条信息
附件: 您所在的用户组无法下载或查看附件
图四:有客户端断开连接(提示:Disconnected)
2、客户端程序运行。 客户端程序中输入服务器端所在的IP,然后点连接,如果成功就会提示连接成功,然后在下面的编辑框里输入信息就可以发送了。如果连接不成功就会提示等待,此时有可能是服务器IP输入错误或是服务器端达到了最大的进程。客户端程序可以在程序源代码中预先设置一批服务器的IP,然后点连接,如果当前显示的服务器不能连接成功,则程序自动连接预先设置的第二个IP,一直循环测试连接,当与一台服务器连接成功为时,提示连接成功,并停止循环。
附件: 您所在的用户组无法下载或查看附件
图五:客户端运行(服务器地址显示的为预先设置的IP)
附件: 您所在的用户组无法下载或查看附件
图六:客户端连接成功
附件: 您所在的用户组无法下载或查看附件
图七:客户端发送“你好!”并接受“服务器端回复”两条信息
六、心得体会 经过本次课程设计,基本掌握了Winsock编程的应用,对windows API函数的调用有了一定的了解,面对当前网上流行各种聊天室有了一定的认识,不再是那么神秘。另外就是对基于服务器的并发多机信息转发技术的了解。在聊天室程序中是这样实现的:当某一客户机向其它客户机发送信息时,不是直接发给它,而是先发给服务器,然后由服务器分发给其它所有连接到服务器的客户机。还有就是对VC++的学习,通过这次课设让我对VC++有了更深的认识,也了解到了它的功能的强大。最后最重要的是将操作系统课程中所学到了理论知识应用到了实践,对其有了更深刻的认识。 七、主要参考资料: 1、计算机操作系统教程; 2、Visual c++网络通讯协议分析与应用实现(人民邮电出版社),汪晓平 钟军 编著; 3、MSDN参考。