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


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

最后:天气冷了,各位要注意身体!
...全文
137 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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组播通信了.

18,363

社区成员

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

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