client用鼠标关闭,server没有反应,client停止调试,server有反应

tan625747 2009-12-19 07:07:52
服务端代码:
	case WM_SOCKET:
if (WSAGETSELECTERROR(lParam))
{
// Display the error and close the socket
closesocket( (SOCKET) wParam);
break;
}
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
Accept = accept(wParam, NULL, NULL);
WSAAsyncSelect(Accept, hWnd, WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);//为新的socket注册异步事
n++;

g_pMayiServer->AddSocket(Accept,n);

// CLSLOG2("有%d个客户连接\n",n);
break;

case FD_READ:
g_pMayiServer->recvMayi (wParam);
//CLSLOG2("FD_READ 次数 %d\n",rnum);
//rnum++;

break;

case FD_WRITE:
g_pMayiServer->SendToAll (wParam);
//CLSLOG2("FD_WRITE 次数 %d\n",wnum);
//wnum++;
break;
case FD_CLOSE:
MessageBox(NULL,"有客户断退出","服务端",NULL);
g_pMayiServer->EraseSocket(wParam);
closesocket( (SOCKET)wParam);
break;
}
break;



客户端代码:
            case FD_CONNECT :
WSAAsyncSelect(MayiClient,hWnd, WM_SOCKET, FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);
break;

case FD_READ:
g_pMayiClient->recvMayi(wParam);//接收信息
CLSLOG2("FD_READ 次数 %d\n",rnum);
rnum++;

break;
case FD_WRITE:
g_pMayiClient->sendMayi(wParam,wStrName,wStrPass);//发送消息
CLSLOG2("FD_WRITE 次数 %d\n",wnum);
wnum++;
break;
case FD_CLOSE:

ret=closesocket( (SOCKET)wParam);

break;
}
break;



用鼠标关闭客户端,服务端不能弹出对话框
用debug->stop debugging 的方法,关闭客户端,服务能弹了MessageBox(NULL,"有客户断退出","服务端",NULL);


不知是怎么回事,我要的效果是用鼠标关闭客户端,服务能也能弹出MessageBox(NULL,"有客户断退出","服务端",NULL);
消息。


不知是怎以做,请高人指点,谢谢。

最后:天气冷了,各位要注意身体!
...全文
131 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
捧剑者 2009-12-20
  • 打赏
  • 举报
回复
mark
tan625747 2009-12-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 cnzdgs 的回复:]
引用 10 楼 tan625747 的回复:
我想那么做,可
case WM_CLOSE: //窗口关闭消息
::Sleep (1000);
closesocket( (SOCKET)wParam);
DestroyWindow(hWnd); //发出销毁窗口消息
break;

这样做感觉不对wParam  这个参数不能是指套节字

把socket保存在变量里面,closesocket的时候使用这个变量。
另外,不要Sleep。
[/Quote]

结贴了


有此方法解决的
cnzdgs 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tan625747 的回复:]
我想那么做,可
case WM_CLOSE: //窗口关闭消息
::Sleep (1000);
closesocket( (SOCKET)wParam);
DestroyWindow(hWnd); //发出销毁窗口消息
break;

这样做感觉不对wParam  这个参数不能是指套节字
[/Quote]
把socket保存在变量里面,closesocket的时候使用这个变量。
另外,不要Sleep。
yschenwei 2009-12-19
  • 打赏
  • 举报
回复
接收到-1或是指定的退出命令之后 sendmessage FD_CLOSE 。
yschenwei 2009-12-19
  • 打赏
  • 举报
回复
客户端退出的时候就是在closesocket之前向服务器发送一个退出的命令。
或是直接不用发送,服务器端直接接收都可以,recv方法返回的肯定是-1.
tan625747 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
关闭窗口时调用closesocket试试。
[/Quote]

我想那么做,可
case WM_CLOSE: //窗口关闭消息
::Sleep (1000);
closesocket( (SOCKET)wParam);
DestroyWindow(hWnd); //发出销毁窗口消息
break;

这样做感觉不对wParam 这个参数不能是指套节字
tan625747 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 o1_1o 的回复:]
关闭client的socket时,添加sleep(30)或者sleep(100)。
[/Quote]

我在客户端的
case FD_CLOSE:

ret=closesocket( (SOCKET)wParam);

case WM_CLOSE: //窗口关闭消息
::Sleep (1000);

都不行,用鼠标点关闭都服务端都不能弹出,只有stop debugging 服务端能弹出
neurobot 2009-12-19
  • 打赏
  • 举报
回复
关闭client的socket时,添加sleep(30)或者sleep(100)。
cnzdgs 2009-12-19
  • 打赏
  • 举报
回复
关闭窗口时调用closesocket试试。
tan625747 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yschenwei 的回复:]
就算是你的客户端可以收到FD_CLOSE事件。
你的服务器端也能接收到客户端的FD_CLOSE事件?
或者你服务器的FD_CLOSE还有可能是server socket的。
[/Quote]
具我的情况分析:


鼠标关闭方式关闭客户端,服务端不能收到客户端FD_CLOSE事件

用stop debugging 应该可以收到 客户端FD_CLOSE事件


这就是问题的关键!
tan625747 2009-12-19
  • 打赏
  • 举报
回复
回复3楼

客户端关闭的时候能产生FD_CLOSE事件


这个就是不知道客户端关闭的,不知道能不能才生fd_close 事件

客户端代码:
case FD_CLOSE:

closesocket( (SOCKET)wParam);
MessageBox(NULL,"客户端退出","客户端",NULL);

用鼠标关闭,和stop debugging 客户端都不能产生MessageBox(NULL,"客户端退出","客户端",NULL);

yschenwei 2009-12-19
  • 打赏
  • 举报
回复
就算是你的客户端可以收到FD_CLOSE事件。
你的服务器端也能接收到客户端的FD_CLOSE事件?
或者你服务器的FD_CLOSE还有可能是server socket的。
这不是鸭头 2009-12-19
  • 打赏
  • 举报
回复
如果 客户端关闭的时候能产生FD_CLOSE事件,则
case FD_CLOSE:
ret=closesocket( (SOCKET)wParam);
就会关闭socket
如果没有产生FD_CLOSE: 就不知道你有没有在别的地方关闭socket了....
自己关闭的时候 能不能产生FD_CLOSE事件,没有试过不知道.....
tan625747 2009-12-19
  • 打赏
  • 举报
回复


在客户端关闭的时候,不知道有没有关闭socket,不知道怎么看。
这不是鸭头 2009-12-19
  • 打赏
  • 举报
回复
在关闭的时候,没有关闭socket?
不会是用的这段吧:
case FD_CLOSE:
ret=closesocket( (SOCKET)wParam);

自己能产生FD_CLOSE事件吗?
TCP/UDP Socket调试工具提供了TCP Server,TCP Client,UDP Server,UDP Client,UDP Group 五种Socket调试方案。 下面是一份简要的使用流程: TCP通信测试: 1) 创建TCP Server 选中左方的TCP Server, 然后点击”创建”按钮,软件弹出监听端口输入框。 输入监听端口后,即创建了一个在指定端口上进行监听的TCP Server Socket。TCP Server Socket创建时,软件会自动启动TCP Server Socket处于监听状态: 2)创建TCP Client 选中左方的TCP Client, 然后点击”创建”按钮, 软件弹出输入框: 确认后,软件即创建了一个TCP Client Socket. 创建TCP Client Socket时,软件不会自动进行连接Socket的操作. 2) 连接Socket 点击刚创建的TCP Client,右方会出现其相关操作面板,点击“连接”按钮进行Socket连接。 这时,TCP Client就建立了与TCP Server的连接。在TCP Server下面,自动增加了一个与该连接对应的Socket。 3)数据收发 在连接建立成功后,可以进行数据收发的测试: 当鼠标点中每个Socket时, 软件都会在右方提供操作该Socket的面板. 在面板里提供了数据收发的窗口。其中下面的是数据发送窗口. 点中TCP Server方的Socket, 然后在操作面板中输入数据12345,然后点击发送: 在TCP Client端的Socket即可收到数据, 可以点击TCP Client Socket,进行察看. 反之,TCP Client也可以向TCP Server发送数据 关于十六进制HEX格式的发送: 把显示十六进制的选择项选中,然后在数据发送窗口即处于HEX输入模式了, 在里面直接输入HEX格式内容:如 313233,然后点击发送数据按钮: 在TCP Server端的Socket即可收到数据123: Web页演示测试: 将TCP服务器的 启动Web服务 勾上,那么该TCP服务器端口可以自动向浏览器发送一个简单的Web页面: 在IE里面输入如下地址: 然后回车,即可看到Web演示页面: UDP通信测试: 分别创建UDP Server和UDP Client: UDP Server刚创建成功时,其对方IP及对方端口都是空的. 必须要收到UDP Client先发送的数据包后, UDP Server才确定对方IP及对方端口,并进行数据包的发送. UDP Client则在创建的时候及指定了对方IP及对方端口号, 因此,两个UDP Client之间也是可以通信的. 而UDP Server则必须与UDP Client才行进行通信. 先由UDP Client发送数据: UDP Servers收到数据 在UDP Server收到过UDP Client的数据后,其对方IP地址和UDP端口均可确定下来,然后UDP Server也可以向UDP Client发送数据了: 关于UDP广播的测试: 在UDP Client创建时,可以选择是否创建UDP 广播: 点击广播地址后,软件会自动计算广播地址: 点击确定后,创建的UDP Socket发送的就是UDP广播包了. UDP 组播测试 1) 创建UDP组 选中左方的UDP Group, 然后点击”创建”按钮,软件弹出组播地址即组播端口输入框。 点击确定后,即创建一个组播UDP Socket: 在另外一台联网的电脑上,创建同样组播地址和组播端口的组播UDP Socket. 然后就可以进行UDP组播通信了.
ESX Server 3.5、ESX Server 3i 版本 3.5 和 VirtualCenter 2.5 的 Update 2 版本 索引 数字 530 Please Login with USER and PASS 47 B 备份策略15 C CD 测试64 测试, 介质64 磁盘 本地19, 23, 37 持久模式20, 61 分区65 GSX Server 78 共享的 VMFS 23 裸62 RAID 59 SATA 59 SCSI 59 VirtualCenter 77 VMDK 80 Workstation 78 虚拟19, 24, 36, 40, 61 D DRAC 59 端口 80 46 E ESX Server 升级支持55 esxupdate 69 EULA 67, 69 F 方案28, 31, 39 G grub, 引导加载程序65 GSX Server 虚拟磁盘, 与 ESX Server 配 合使用78 I IDE 磁盘59 ILO 59 iSCSI 磁盘59 J 键盘64, 67 脚本68 介质测试64 K 块大小, VMFS3 的限制18, 70 M Microsoft Access 数据库 迁移51 模板, 升级77 N NFS 装载, 升级后还原61 内部升级19, 22 升级指南 86 VMware, Inc. P PCI 设备, 分配60 Q 迁移升级20, 22 R RSA II 59 S SAN 59 SAS 磁盘60 SATA 磁盘59 SCSI 磁盘59 SDK 13 升级 ESX Server 25, 62, 81 阶段 1 22, 80 阶段 2 23, 81, 82 阶段 3 26 阶段 4 27 具有裸磁盘的虚拟机62 模板77 使用 SAN 的 ESX Server 主机23 使用本地磁盘的 ESX Server 主 机23 VI Client 80 VirtualCenter 80 VirtualCenter Server 48 VirtualCenter 数据库47, 49 VMFS2 到 VMFS3 25, 70, 82 VMware Tools 74, 84 虚拟硬件73, 83 支持45, 55 升级 VMotion 20 升级方案28, 31, 39 升级要求, ESX Server 58 鼠标65 数据库47 数据库升级向导52 T tarball 68 TCP/IP 46 调试模式61 U upgrade.pl 68 V VM2 虚拟机格式19, 73 VM3 虚拟机格式19, 73 VMFS2 18 VMFS3 18 块大小18, 70 VMware 架构, 发生的变化17 VMware Tools, 升级74 W Windows 2000 Server SP4 50 Workstation 虚拟磁盘, 与 ESX Server 配 合使用78 X 虚拟机 升级过程中的停机时间17 Y 引导加载程序 grub 65 记录67 位置67 用例28, 31, 39 预升级脚本17, 63 Z 支持的升级 ESX Server 55 VirtualCenter 45 VMware, Inc. 87 索引 主引导记录67 最终用户许可协议67, 69
J2SE ( Java 2 Standard Edition)就是Java2的标准版,主要用于桌面应用软件的编程,是伴随着计算机技术的飞速发展而诞生的一项新的开发技术。随着个人电脑的日益普及、Java功能在个人电脑上的实现,Java应用程序产生的单机增值服务逐渐体现出其影响力,对丰富人们的生活内容、愉悦身心、开发智力等起着不可忽视的作用。而随着网络的普及,信息技术的发展,电子竞技也以一种正规的行业逐步走进了人们的生活,特别是对年轻的一代,游戏更是娱乐项目中不可缺少的一种,玩游戏是一种娱乐,其实开发游戏更会使人乐在其中。 局域网坦克大战采用MyEclipse平台开发调试。玩家坦克的运行是通过键盘响应事件控制,敌方坦克则是自动运行并具有了一定的智能性。程序进行了精简和优化,游戏运行流畅,具有一定的吸引力。 论文通过总结和分析JAVA游戏的开发流程和代码框架的设计,开发了一款基于J2SE架构的游戏——局域网坦克大战,该游戏主要分为场景类、子弹类、坦克类、敌方坦克类、我方坦克类等几个类,能够实现敌方坦克和子弹的智能化运行等,具有一定的复杂性和可玩性。 题目:基于J2SE的局域网坦克大战设计与实现 运行平台要求: 1 首先电脑里按有JDK,然后安装MyEclipse。如果没有MyEclipse,只安装JDK也可以。 2 电脑系统Wxp,W7都可以,最好是Wxp 导入工程步骤和运行程序: 1 先讲解用JDK如何运行 (1)找到tank_java里的src文件夹,把src文件夹放到硬盘里,例如是D盘。 (2)开始->运行->cmd->输入d: ->cd src ->cd wyf ->cd cgq ->javac TankServer.java->java TankServer (3)开始->运行->cmd->输入d: ->cd src ->cd wyf ->cd cgq ->javac ClientServer.java->java ClientServer (4)输入用户名和IP等即可游戏。 2 用MyEclipse如何运行 (1)打开Myeclipse->File->import->General->Existing Projects into Workspace->选中Select root directory->单击右边的Browse ->找到Tank_Java,选中,确定->Finish (2)找到src打开->wyf.cgq->鼠标右键TankServer.java->Run As->Java Application (3)找到src打开->wyf.cgq->鼠标右键ClientServer.java->Run As->Java Application (4)输入用户名和IP等即可游戏。

18,356

社区成员

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

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