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


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

最后:天气冷了,各位要注意身体!
...全文
140 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事件吗?

18,358

社区成员

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

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