社区
网络编程
帖子详情
如何完全停止正在监听的Socket
snowfog
2004-03-19 10:00:47
我的程序中有一个监听Socket,它对应一个监听线程,该线程中使用事件选择的方式监听FD_ACCEPT和FD_CLOSE;在外部的主线程中希望关闭该监听线程,使用closesocket不成功,因为waitfor函数不返回,不知道该如何做?
...全文
739
16
打赏
收藏
如何完全停止正在监听的Socket
我的程序中有一个监听Socket,它对应一个监听线程,该线程中使用事件选择的方式监听FD_ACCEPT和FD_CLOSE;在外部的主线程中希望关闭该监听线程,使用closesocket不成功,因为waitfor函数不返回,不知道该如何做?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
itren
2004-03-19
打赏
举报
回复
呵呵!
snowfog
2004-03-19
打赏
举报
回复
侦听的套接字如何在服务器端主动产生 FD_CLOSE 事件?这个问题还没有解决。
xstring
2004-03-19
打赏
举报
回复
肯定是端口还被占用着,所以bind不成功
不知道你重新启动服务时, StopServ是不是被调用了
查查看
snowfog
2004-03-19
打赏
举报
回复
我是一个指针用错了,改正之后就不会有上面的问题了。
感谢大家!
过会就结帖。
snowfog
2004-03-19
打赏
举报
回复
我使用为主线程增加事件的方式之后可以停止监听线程的运行。但是再次重新启动服务器时第一次调用StartServ失败,第二次就成功,错误是发生在bind函数。为什么?怎么解决?
int CSocketServer::StartServ()
{
if (m_ServiceState == SS_Started)
{
return SUCCESS;
}
sockaddr_in local;//本地服务器地址
HANDLE hThread;//监听线程句柄
DWORD dwThreadId;//监听线程Id
//创建监听Socket
m_sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (m_sListen == SOCKET_ERROR)
{
m_iInitSuccess = FAULT;
closesocket(m_sListen);
return m_iInitSuccess;
}
//绑定
local.sin_addr.s_addr = inet_addr(m_cServerIP);
local.sin_family = AF_INET;
local.sin_port = htons(m_iServerPort);
if (bind(m_sListen, (sockaddr *)&local, sizeof(local)) == SOCKET_ERROR)
{
m_iInitSuccess = FAULT;
closesocket(m_sListen);
return m_iInitSuccess;
}
//监听
listen(m_sListen, m_iBacklog);
。。。
}
int CSocketServer::StopServ()
{
SetEvent(m_MainEvent);
shutdown(m_sListen, SD_BOTH);
closesocket(m_sListen);
}
comman_wang
2004-03-19
打赏
举报
回复
先调用shutdown(),再调用closesocket()。
因为closesocket只是使引用减1,当为零时,才关闭。
snowfog
2004-03-19
打赏
举报
回复
我在服务器端为每个客户端建立的socket及线程,服务器就是主动调用closesocket就能够触发FD_CLOSE事件。
flinming
2004-03-19
打赏
举报
回复
线程先关闭再说。。。
chenwhenlong
2004-03-19
打赏
举报
回复
要是会发生 FD_CLOSE 事件,假设有 5 个client 进行连接,那不就要发生 5 个 FD_CLOSE 事件吗?
chenwhenlong
2004-03-19
打赏
举报
回复
侦听的套接字不会产生 FD_CLOSE 事件。
FD_CLOSE 事件是要对方断开连接时才会发生的。
要是会发生 FD_CLOSE 事件,假设有 5 个client 进行连接,那不就要发生 FD_CLOSE 事件吗?
snowfog
2004-03-19
打赏
举报
回复
我就是调用了closesocket而没有触发close事件。
chenwhenlong
2004-03-19
打赏
举报
回复
FD_CLOSE 事件是对方调用 closesocket 时才会触发吧?
snowfog
2004-03-19
打赏
举报
回复
xstring(麻雀) ,chenwhenlong(bester) 的方法是相同的,而且应该可行,我再试试。
不过有没有办法使监听socket触发close的事件?相应的为每个客户端建立的线程是可以用closesocket触发close事件的。
chenwhenlong
2004-03-19
打赏
举报
回复
我暂时是这样实现的:
UINT WINAPI ListenThreadProc(LPDWORD pvData)
{
WSAEVENT wsaEvents[2];
SOCKET hSocket = (SOCKET)pvData[0];
wsaEvents[0] = (WSAEVENT)pvData[1]; // 主线程要求关闭时通知的事件对象
wsaEvents[1] = (WSAEVENT)pvData[2]; // 有网络事件时通知的事件对象
/////////////////////////////////////////////////////////////////////
// 等待并处理客户事件
DWORD dwWaitStatus;
BOOL bExitThread = FALSE;
WSANETWORKEVENTS NetworkEvents;
while (!bExitThread) {
// 等待客户加入或停止 IOCPServer...
dwWaitStatus = WSAWaitForMultipleEvents(2, wsaEvents, FALSE,
INFINITE, FALSE);
switch(dwWaitStatus) {
case WSA_WAIT_EVENT_0: // 主线程要求关闭
bExitThread = TRUE; // 退出线程
break;
case WSA_WAIT_EVENT_0 + 1: // 网络事件
if (WSAEnumNetworkEvents(hSocket, wsaEvents[1], &NetworkEvents)
!= SOCKET_ERROR)
{
// 处理网络事件
}
break;
default:
break;
}
}
closesocket(hSocket);
WSACloseEvent(wsaEvents[0]);
WSACloseEvent(wsaEvents[1]);
return 0;
}
xstring
2004-03-19
打赏
举报
回复
主线程中多创建一个event
在监听线程中使用WaitForMultipleObject,传入跟socket有关的那个event和主线程中创建的那个event,不要wait all
要停止监听时,在主线程中调用SetEvent (主线程创建的那个event)
这样监听线程中WaitFor会返回,监听线程这时候closesocket就可以了
mzg3
2004-03-19
打赏
举报
回复
listen的是不会产生FD_CLOSE事件的
如果你硬是要这个事件的话就自己产生好了:
if (closesocket(listenfd)!=SOCKET_ERROR)
SendMessage(WM_XXXX,listenfd,FD_CLOSE);
其中:
listenfd是侦听的套接字
WM_XXXX是你自己定义的SOCKET关闭的事件
TortoiseSVN入门:从安装到冲突解决
TortoiseSVN是一款Windows平台下的SVN图形化客户端工具,通过集成资源管理器提供便捷的版本控制操作。主要功能包括代码检出、提交更新、分支管理、冲突解决等。安装后需重启系统生效,可在设置中调整语言和工具配置。使用前需先检出代码到本地,工作时应频繁更新和提交以避免冲突。提交需填写清晰的日志信息,敏感文件可通过忽略功能排除。遇到冲突时建议协商解决或使用工具合并差异。常见问题包括密码错误和连接失败,可通过检查URL地址、重启服务等方式解决。该工具适合团队协作开发,能有效管理代码版本和变更历史。
让TortoiseSVN使用类似TortoiseCVS的文件冲突解决方式
让TortoiseSVN使用类似TortoiseCVS的文件冲突解决方式 问题的产生:对于采用Copy-Modified-Merge方式的版本控制系统,冲突的管理和解决是非常重要的。目前公司的一个项目由于系统的版本升级,系统的源代码在开发过程中有大量的文件重命名操作...
TortoiseSVN(冲突解决)
1,实际开发中提交 ,一定要先更新,然后在提交,在多人合作中要划分模块,分逻辑,分功能,高效开发 。 2,演示: 【1】先Add添加 【2】修改后 在次提交 【3】另一个用户创建文件夹,链接SVN 地址是服务器 IP地址 /svn/仓库名字 查看不到。任务进程中关闭桌面进程,然后在创建一个桌面进程查看 是否于SVN关联 updata 先更新在进行修改...
windows下TortoiseSVN 文件冲突解决详细步骤 (图)
TortoiseSVN 冲突解决详细步骤 (图) 转自:http://www.cnblogs.com/kenkofox/archive/2010/10/17/1853785.html 冲突还是很好解决的,但我没有试过在IDE里边集成怎样。记得VSS在Visual Studio里边解决冲突就非常完美,冲突自动报告,自动弹出冲突解决窗口,让你处理该怎么合并两份版本。合并后自动签入commi
TortoiseSVN的使用,以及冲突解决办法
接下来,试试用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突等. 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文件会显示为没有版本控制的状态,如图: 这时候,你需要告知TortoiseSVN你的操作,如图: 加入以后,你的文件会变成这个状态,如图: 这时候使用TortoiseSVN进行提交.这样别人就能看到你所做的更改...
网络编程
18,356
社区成员
64,161
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章