这是什么问题?关于服务器和客户端登出时的一些问题,这是什么问题?

CoolEgos 2014-05-05 03:42:38
客户端和服务器都有一个在线客户的列表,所有有客户端登出的时候,客户端就应该向服务器发消息告诉自己下线了。
此时服务器在线用户列表的数量应该减一。

但是却出现了这样的问题,我先开启服务器,
然后客户端“111”登入,客户端“222”登入,客户端“333”登入。
然后退出。
退出的时候只有“333”,“222”,“111”这样的顺序,才能正常的退出完,这是为什么啊?


例如:退出的时候按照“222”,“333”,“111”这样的顺序退出有问题啊。。

客户端退出时的操作
void Chat::OnClose()
{
// TODO: Add your message handler code here and/or call default
//关闭的时候向服务器发送消息自己要关闭了
//AfxMessageBox(m_caption);
//发送消息的type='O'表示是退出的消息
MESSAGE mess_out;
mess_out.type='O';
char *ss_name = CStringto(this->m_caption); //m_caption为客户的昵称
memcpy( mess_out.sender,ss_name, strlen(ss_name)+1);
memcpy( mess_out.receiver,"123", sizeof("123"));
memcpy( mess_out.sendBuf,"123", sizeof("123"));
send(this->m_userSoc,(char *)&mess_out,sizeof(MESSAGE),0);
CDialogEx::OnClose();
}

服务器收到退出消息以后的操作(num为全局变量表示在线客户的人数)
else if(recvmess.type=='O'){

//收到离线的消息以后先将本地客户的信息删除掉
//然后将离开人的昵称告诉所有人(仍然在线的人)
AfxMessageBox(CString(recvmess.sender));
num--;
CString str;
str.Format(_T("在线人数:%d"),num);
//AfxMessageBox(str);
pDlg->GetDlgItem(IDC_EDIT4)->SetWindowText(str);
}
...全文
204 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
CoolEgos 2014-05-05
  • 打赏
  • 举报
回复
引用 9 楼 worldy 的回复:
lz啊,关键的不是这些大妈的问题,问题在于你接收的数据存到recvmess的代码,这些代码肯定和发送的数据错位咯
不是你说的这个问题,我好像找到了,因为服务器每次接收 消息的时候都会遍历所有的socket,而遍历的时候正事用到了num
worldy 2014-05-05
  • 打赏
  • 举报
回复
lz啊,关键的不是这些大妈的问题,问题在于你接收的数据存到recvmess的代码,这些代码肯定和发送的数据错位咯
CoolEgos 2014-05-05
  • 打赏
  • 举报
回复
引用 6 楼 lis2012 的回复:
单从你的代码上看不问题出处,但是你的客户端退出代码这么写,直接向服务器发一个消息就退出了也不关闭socket,服务端只给出了接受数据处理的代码,根本不知道你三个连接socket是怎么存放的,你如何判断是和哪个发送的,从你的描述中可以推测跟你保存顺序有很大关系
只要把
num--;
自减的这一句删掉就可以正常接收了,不知道为什么。。。。。
CoolEgos 2014-05-05
  • 打赏
  • 举报
回复
引用 6 楼 lis2012 的回复:
单从你的代码上看不问题出处,但是你的客户端退出代码这么写,直接向服务器发一个消息就退出了也不关闭socket,服务端只给出了接受数据处理的代码,根本不知道你三个连接socket是怎么存放的,你如何判断是和哪个发送的,从你的描述中可以推测跟你保存顺序有很大关系
我确实是顺序存储的,还有就是num是一个全局变量,我把关于num的代码,也就是这段代码
 num--;
                            CString str;
                            str.Format(_T("在线人数:%d"),num);
                            //AfxMessageBox(str);
                            pDlg->GetDlgItem(IDC_EDIT4)->SetWindowText(str);
注释掉以后又可以正常的接收,不知道为什么
lis2012 2014-05-05
  • 打赏
  • 举报
回复
单从你的代码上看不问题出处,但是你的客户端退出代码这么写,直接向服务器发一个消息就退出了也不关闭socket,服务端只给出了接受数据处理的代码,根本不知道你三个连接socket是怎么存放的,你如何判断是和哪个发送的,从你的描述中可以推测跟你保存顺序有很大关系
CoolEgos 2014-05-05
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
recvmess得到的数据可能是和发送端没有对齐的数据,检查接收逻辑
关键按那个顺序可以正常接收,不按那个顺序收不到
CoolEgos 2014-05-05
  • 打赏
  • 举报
回复
引用 2 楼 fangchao918628 的回复:
会出现什么问题,你没说!
会收不到
worldy 2014-05-05
  • 打赏
  • 举报
回复
recvmess得到的数据可能是和发送端没有对齐的数据,检查接收逻辑
fangchao918628 2014-05-05
  • 打赏
  • 举报
回复
会出现什么问题,你没说!
CoolEgos 2014-05-05
  • 打赏
  • 举报
回复
只有两个用户登入的话也有这样的问题啊? 例如:“111”,“222”登入 登出的时候按“222”,“111”登出的话可以正常登出 但登出的时候按“111”,“222”登出的话却不可以正常登出??
(本站课程停更)作者创意豪,开发有CMS,MVC框架,涉猎PHP,Java,Python,JavaScript,对编程颇感兴趣。 在创意豪看来,PHP相对于其他后端编程语言,具有快速高效开发的优势,在中小型企业快速开发自己的软件这方面,PHP无疑是最优的语言。 而Laravel是PHP中最受欢迎的框架,是最早引入Composer的管理方式,PHP的CLI命令行创建方式,也是最早将服务容器,服务提供者,门面,契约这些概念和设计思想,带入框架整体的使用和开发上。Laravel的出现,给PHP的生态发展增强了一些,同也带动了其他框架的跟进发展。 因此,创意豪推出这个课程,可以让更多PHP开发者,了解和学习到Laravel的先进设计理念。 【简介和安装】Laravel的历史版本Laravel的优势本课程推荐的学习资料下载安装wampwamp新建本地域名的网站下载安装phpstusyphpstudy新建Laravel网站使用Composer国内镜像,下载和运行Laravel运行Laravel的方式 【架构思想】MVC模型图解实战:手写简单的MVC模型Laravel的请求生命周期服务容器的概念和图解依赖注入服务容器的创建和解析两种类型的服务提供者Facades:门面Contracts:契约 【简易CMS:开发CMS的备注模块,实战带动知识点】Laravel开发CMS的备注模块 - 简介下载Laravel和后台HTML模板使用phpstudy配置本地域名路由的方法路由的命名和中间件路由控制器视图生成和运行迁移,设置表字段回滚迁移和重建数据库通过迁移文件,后加字段模型准备备注模块所需的静态页面分拆页面结构CURD增删改查用Tinker新增用Factory新增用create方法新增用save方法新增读取用update方法更新用save方法更新用delete方法删除软删除 【简易CMS:开发CMS的登录登出模块,掌握权限认证】准备登录页面准备登录登出模块所需要的文件和数据表通过路由和代码方式生成后台用户通过tinker方式生成后台用户登录功能登出功能和更换图标整理左边菜单

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧