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);
消息。


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

最后:天气冷了,各位要注意身体!
...全文
152 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组播通信了.
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,357

社区成员

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

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