社区
进程/线程/DLL
帖子详情
CSocket在一个线程中阻塞,如何关闭呢?
squirrel
2000-08-23 09:20:00
它在那里accept,但主线程干完活了,应该结束了,应该怎样把它关闭、删除呢?
如果不关闭,就出现内存泄漏了。
就此祝好,松鼠拜上
...全文
890
17
打赏
收藏
CSocket在一个线程中阻塞,如何关闭呢?
它在那里accept,但主线程干完活了,应该结束了,应该怎样把它关闭、删除呢? 如果不关闭,就出现内存泄漏了。 就此祝好,松鼠拜上
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
meifen
2001-07-13
打赏
举报
回复
4
halbert
2000-09-15
打赏
举报
回复
能不能放个例子上去。出错的地方我们讨论
squirrel
2000-09-13
打赏
举报
回复
再关注。
keotty
2000-09-13
打赏
举报
回复
上面所说的函数都是socketSDK中的函数,在MFC的CSocket类中基本都有对应函数子线程创建socket后,把socket句柄传回主线程,主线程在退出前调用WSACancelBlockingCall来取消阻塞的操作,并设置一flag来中断子线
keotty
2000-09-13
打赏
举报
回复
ssssssssssssssssssssjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
shenxinyu
2000-09-13
打赏
举报
回复
防止SOCKET阻塞的方法有几种。
1、如Redspider所说,在调用accept之前,调用select等待是否有数据到达,如果没有,你可以检测主线程设置的一个flag来决定是否中断线程。如果有数据到达,调用recv来接收数据。
2、如果不调用select,如dzl所说,自己向自己的端口发一特定数据包来中断线程。
3、子线程创建socket后,把socket句柄传回主线程,主线程在退出前调用WSACancelBlockingCall来取消阻塞的操作,并设置一flag来中断子线程。
上面所说的函数都是socketSDK中的函数,在MFC的CSocket类中基本都有对应函数
select函数可以用CAsyncSocket中的AsyncSelect代替。
希望也给我点分。
netsong
2000-09-13
打赏
举报
回复
关注
squirrel
2000-08-30
打赏
举报
回复
这个方法还是可以 吧。虽然有点浪费,曲折一点。
大家说呢?
dzl
2000-08-28
打赏
举报
回复
一种笨办法:自己和自己连接
因为子线程的CSocket一直在Listen和Accept,所以当主线程想关闭子线程时,主线程可以建立一客户端SCokcet,利用CSocket向子线程的CSocket发送一特定的数据,当子线程接收到这个数据包时就可以把CSocket及其它资源关闭并删除掉,最后结束线程。
squirrel
2000-08-28
打赏
举报
回复
我已经给红蜘蛛加分了,但还是希望继续指教。
squirrel
2000-08-28
打赏
举报
回复
我阻塞在那里的目的就是让流程比较顺畅一些。。。
先发送一个校验,然后一个号码,然后一个命令码,然后再循环,以接收下一次命令。。。
Redspider
2000-08-26
打赏
举报
回复
select是SOCKET里的一个函数,你用的是CSOCKET,因为改用消息回调方式,把这个给去掉了。
select的作用就是检测套接字上有无数据或者连接请求到达,因为如果当前没有客户端连接进
来,你的accept就会阻塞在那儿出来,从而导致线程无法主动退出。
如果你不愿意直接SOCKET而坚持用CSOCKET的话,你也可以通过重载
CAsyncSocket::OnConnect ,在那里面Accept,从而避免阻塞。
squirrel
2000-08-25
打赏
举报
回复
好像越来越复杂了。
难道不能主线程里把listen线程的socket关闭,然后把这个线程关掉?。
select是什么东西?(不好意思,我对socket太陌生了。但CSocket里好像没有?)
我对加分没什么意见,但好像我还是没有从这两个帖子里学到什么。。。
Redspider
2000-08-24
打赏
举报
回复
1
他是说他在工作线程里开了个SERVER在那儿LISTEN,而且是无条件的ACCEPT。
应该在ACCEPT之前先用SELECT检测一下LISTEN用的SOCKET,判断是否有连接
请求,有再ACCEPT,没有可以干别的事去,效率要比你阻塞在那儿高得多。
简单示例:
fd_set t_testfd;
struct timeval t_interval;
......
while(...)
{
............
FD_ZERO(&t_testfd);
FD_SET(t_listensocket,&t_testfd);
t_interval.tv_sec = 0;
t_interval.tv_usec = 0;
if(!select(0,&t_testfd,NULL,NULL,&t_interval))
{
Sleep(1);
continue;
}
t_length=sizeof(sockaddr);
t_acceptsocket = accept(t_listensocket,(struct sockaddr *)&t_sockaddr,&t_length);
......
}
.....
别忘了给分!
Kevin_qing
2000-08-24
打赏
举报
回复
server死了,你还在listen?
listen 是在server端進行的呀,怎么回事?
squirrel
2000-08-24
打赏
举报
回复
你所说的方法是正常的方法。但当出现异常,例如SERVER端已经死了,而我这里的listen还在等待。。。。Right here waiting....
我需要在主线程里把listen线程的socket关闭,然后把这个线程关掉。
所以,还不能说你解决了我的问题。
Kevin_qing
2000-08-23
打赏
举报
回复
很簡單。
在程序中增加一 flag 表明是否可以结束server 线程。
当你需要退出时,server端先发一连接请求到本程序的listen口,listen线程就可以继续运行了,这时簡查flag,看是否关闭socket。
这样需要一个listen线程,和一个monitor线程。
采用C
Socket
和多
线程
编写的文件传输程序
在本文
中
,我们将深入探讨如何使用`C
Socket
`和多
线程
技术来构建
一个
文件传输程序,这个程序是在Visual Studio 2008环境下编译的。`C
Socket
`是MFC(Microsoft Foundation Classes)库
中
的
一个
类,它为Windows环境下的...
多
线程
C
Socket
在服务端,通常采用
一个
主
线程
负责监听端口,等待客户端的连接请求,一旦接收到新的连接请求,就会创建
一个
新的工作
线程
来处理该连接,以确保每个客户端都有独立的资源和服务。 - **主
线程
(CSCEServerDlg)**:...
C
Socket
-com.rar_c
socket
多
线程
在C
Socket
与多
线程
的结合
中
,通常我们会为每个连接创建
一个
单独的
线程
,这样可以避免主
线程
被
阻塞
,确保服务端可以同时处理多个客户端的请求。 实现C
Socket
多
线程
通信的步骤大致如下: 1. **初始化Winsock**:在...
基于MFC 的
Socket
类的多
线程
文件传输
在文件传输过程
中
,多
线程
可以极大地提高效率,例如,
一个
线程
负责接收文件,另
一个
线程
负责写入磁盘,这样可以避免单
线程
操作时的
阻塞
,提高整体传输速度。在MFC
中
,我们可以使用CWinThread类来创建和管理
线程
。 ...
ChatRoom(C
socket
).zip_c
socket
_c
socket
聊天室_单
线程
异步 c++
总的来说,"ChatRoom(C
socket
)"项目展示了如何在C++
中
利用c
socket
库构建
一个
简单的单
线程
异步聊天室,这对于理解网络编程原理和实践是非常有价值的。通过这个实例,开发者不仅可以学习到套接字的基本操作,还能掌握...
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章