社区
进程/线程/DLL
帖子详情
CSocket在一个线程中阻塞,如何关闭呢?
squirrel
2000-08-23 09:20:00
它在那里accept,但主线程干完活了,应该结束了,应该怎样把它关闭、删除呢?
如果不关闭,就出现内存泄漏了。
就此祝好,松鼠拜上
...全文
816
17
打赏
收藏
CSocket在一个线程中阻塞,如何关闭呢?
它在那里accept,但主线程干完活了,应该结束了,应该怎样把它关闭、删除呢? 如果不关闭,就出现内存泄漏了。 就此祝好,松鼠拜上
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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线程。
winsock多
线程
阻塞
通信
winsock多
线程
阻塞
网络通信源码,经典实验
Symbian OS
中
的活动对象的使用
Symbian OS
中
提供了很多异步函数,这些异步函数大多部分都是基于“服务器-客户端”架构的。这里与win32 api
中
的函数有很大的不同。如: win32
中
,C
Socket
::Receive(是recv而不是WSARecv)为同步函数,
线程
阻塞
在Receive处,直到套接字接收到了网络流才返回。 Symbian OS也有类似的函数,R
Socket
::Receive,但是此函数是
一个
异步函数,
线程
不会
阻塞
在Receive处而会继续执行。
MFC设计局域网对战五子棋游戏(源代码)
开发环境采用Visual Studio 2010旗舰版,因为不需要做什么项目,因为我还是学生呵呵,所以不需要考虑太多的兼容性方面的因素,还是喜欢用新的工具。 开发过程
中
使用到的技术大概有: DWM API:这是vista以来新增的API,具体内容见MSDN,游戏
中
只使用了部分窗口毛玻璃的效果; GDI混合GDI+:因为GDI+不支持双缓冲,所以画图时先使用GDI创建缓冲位图,然后使用GDI+的Graphics画在这个位图上,最后由GDI绘制到屏幕; C
Socket
:局域网对战肯定要用到
socket
通信,因为数据量很少,所以使用了封装好的比较简单的C
Socket
类,这样可以省不少代码; 多
线程
和互斥对象:因为CSokcet工作在
阻塞
模式,所以不能使用主
线程
接受和发送游戏数据,我把绘制图像的代码也放在
一个
独立
线程
中
,所以需要使用互斥对象来确保主
线程
退出时所有子
线程
以释放主
线程
中
的资源,否则会引起内存错误; 自绘控件:在游戏
中
使用默认的控件也太挫了吧,所以就要自己绘制控件,这样才像游戏,虽然市面上有很多,但是拿来的和自己写的用着感觉不一样;
使用VC++的网络编程总结
1.套接字编程原理 1.1 Client/server 通信模型 1.2 Windows
Socket
s 规范 1.3 套接字 1.3.1 套接字定义 1.3.2 分类 1.3.3 套接字的作用 1.3.4 端口与地址 1.3.5 套接口属性 2.基本的Windows
Socket
s API 编程 2.1 常用函数 2.2 TCP 实例 2.3 UDP 实例 2.4
Socket
通信
阻塞
的解决方法 3.MFC 下的
Socket
编程的类 3.1 CAsync
Socket
类 3.2 C
Socket
类 3.3 Windows
Socket
s:带存档的套接字的工作方式 3.4 流式套接字通信的操作顺序 3.5 使用CAsync
Socket
类 3.6 从套接字类派生 3.7 套接字通知 3.8
一个
使用C
Socket
类的网络通信实例 3.8.1 服务器端应用程序设计(ServerDemo) 3.8.2 客户端应用程序设计(项目名称ClientDemo) 4.套接字的托管实现 4.1 System::Net::
Socket
s 命名空间 4.2 实例:
一个
新邮件检查器 5. 怎样实现服务器端多
线程
的
socket
功能?
MFC网络编程之自制浏览器
网络编程,当然要用到Windows
Socket
(套接字)技术。
Socket
相关的操作由一系列API函数来完成,比如
socket
、bind、listen、connect、accept、send、sendto、recv、recvfrom等。调用这些API函数有一定的先后次序,有些函数的参数还比较复杂,对于开发者来说,不是很好用。于是,微软的MFC提供了两个类:CAsync
Socket
和C
Socket
,极大地方便了
Socket
功能的使用。 CAsync
Socket
类在较低层次上封装了Windows
Socket
API,并且通过内建
一个
(隐藏的)窗口,实现了适合Windows应用的异步机制(Windows
Socket
API默认情况下工作在
阻塞
模式,不方便直接在消息驱动的Windows程序上使用)。C
Socket
类从CAsync
Socket
类派生,进一步简化了
Socket
功能的应用。不过很遗憾,正因为这两个类都内建了
一个
窗口,它们并不是
线程
安全的(thread-safe);如果要在多
线程
环境下应用
Socket
功能,建议自行封装
Socket
API函数。 基于TCP的
socket
编程的服务器端程序流程如下: 1、创建套接字 2、将套接字绑定到
一个
本地地址和端口号上(bind) 3、将套接字设为监听模式,准备接受客户请求(listen) 4、等待客户请求,请求到来时接受请求,建立链接,并返回
一个
新的基于此次通信的套接字(accept) 5、用返回的套接字和客户端进行通信(send、recv) 6、返回,等待另一客户请求 7、
关闭
套接字 基于TCP的
socket
编程的客户端程序流程如下: 1、创建套接字 2、向服务器端发送请求(connect) 3、和服务器端进行通信(send、recv) 4、
关闭
套接字 基于UDP的
socket
编程的服务器端程序流程如下: 1、创建套接字 2、将套接字绑定到本地地址和端口号上(bind) 3、等待接收数据(recvfrom) 4、
关闭
套接字 基于UDP的
socket
编程的客户端程序流程如下: 1、创建套接字 2、和服务器端进行通信(sendto) 3、
关闭
套接字 异步方式指的是发送方不等接收方响应,便接着发下个数据包的通信方式;而同步指发送方发出数据后,等收到接收方发回的响应,才发下
一个
数据包的通信方式。
阻塞
套接字是指执行此套接字的网络调用时,直到成功才返回,否则一直
阻塞
在此网络调用上,比如调用recv()函数读取网络缓冲区
中
的数据,如果没有数据到达,将一直挂在recv()这个函数调用上,直到读到一些数据,此函数调用才返回;而非
阻塞
套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比如调用recv()函数读取网络缓冲区
中
数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际Windows网络通信软件开发
中
,异步非
阻塞
套接字是用的最多的。平常所说的C/S(客户端/服务器)结构的软件就是异步非
阻塞
模式的。 对于这些概念,初学者的理解也许只能似是而非,我将用
一个
最简单的例子说明异步非
阻塞
Socket
的基本原理和工作机制。目的是让初学者不仅对
Socket
异步非
阻塞
的概念有个非常透彻的理解,而且也给他们提供
一个
用
Socket
开发网络通信应用程序的快速入门方法。操作系统是Windows 98(或NT4.0),开发工具是Visual C++6.0。 MFC提供了
一个
异步类CAsync
Socket
,它封装了异步、非
阻塞
Socket
的基本功能,用它做常用的网络通信软件很方便。但它屏蔽了
Socket
的异步、非
阻塞
等概念,开发人员无需了解异步、非
阻塞
Socket
的原理和工作机制。因此,建议初学者学习编网络通信程序时,暂且不要用MFC提供的类,而先用Winsock2 API,这样有助于对异步、非
阻塞
Socket
编程机制的理解。
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章