请教:不同线程间如何操作同一个Socket?

sayno 2003-07-09 05:58:44
诸位老大:
我有一个Socket链接(主线程中一个CSocket对象),需要在另一个独立的线程中关闭(或重新连接),但在线程中总是异常(向外发送是正常的,Close和Connect异常),请教了一位老大,他说线程中的映射表是独立的,找不到另一个线程中的Socket句柄和window句柄,但如果我在子线程中创建该CSocket对象,在主线程中又无法操作,请教诸位,这个问题应如何解决?以下是示例代码:

...
CSocket sockTest;
UINT SockClose(LPVOID lParam);
void CTestDlg::OnSocktest()
{
if(sockTest.Create()!=0)
{
if(sockTest.Connect("xxx.xxx.xxx.xxx",5000))
Sleep(10);
}

AfxBeginThread(SockClose,(LPVOID)NULL);
}
UINT SockClose(LPVOID lParam)
{
...
Sleep(1000) ;
sockTest.Close();

...
return 0;
}
...全文
143 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sayno 2003-07-14
  • 打赏
  • 举报
回复
还有一个问题:
我按Detach()...Attch()方式,虽然解决了问题,但在编译release 版本时如果使用 “Use MFC in a static Library” 方式,则程序在Attch()时会出现异常,而如果动态使用MFC 库则一切正常,请问这个问题应如何解决?
sayno 2003-07-10
  • 打赏
  • 举报
回复
kbkman说的也有一定道理,我试了一下,的确不会报错,但在子线程里重新连接后,主线程里的发送和接收都有问题,我想还是和消息分发有关,我再试一下.
又:分不够了,我在论坛里还提过两个同名问题,分别在“网络编程”及“线程”小类里,token_lys和token_lys如有空不妨去点个卯,分数是次要的,无非是表示一下谢意。
sayno 2003-07-10
  • 打赏
  • 举报
回复
谢谢(token_lys对了)!可以了!
先在主线程里Detch 再在子线程里Attach,AfxSocketInit()子线程里可以不做
regainworld 2003-07-09
  • 打赏
  • 举报
回复
应该在线程里初始化一下网络吧也许
whoo 2003-07-09
  • 打赏
  • 举报
回复
>>线程中的映射表是独立的,找不到另一个线程中的Socket句柄和window句柄

只听说进程间是独立的。线程中的映射表是独立的?恕我孤陋寡闻。

不过我倒是象楼主这么用过,一个线程专门负责监测socket连接状态,一旦关闭或非正常丢失,就通知用户,并不停的尝试恢复连接。
我的东东工作的很好。

建议楼主检查其他地方。

不录 2003-07-09
  • 打赏
  • 举报
回复
如果是WinSock API在多线程中使用的话,不会出现异常,

CSocket就会出现问题,主要是CSocketWnd句柄的问题,你用Release版本编译一下运行就不会出现异常了。这问题我遇到过,要了解的话,看一下sockcore.cpp文件就知道了。
token_lys 2003-07-09
  • 打赏
  • 举报
回复
线程中的映射表是独立的,所以另外一个线程找不到句柄。不过不要紧,可以这样做。

在另外一个线程中,生成一个新的CSocket对象,然后调用Attach关联原来的那个CSocket的句柄就可以。

要做好互斥,socket句柄是一个临街资源。
c0der 2003-07-09
  • 打赏
  • 举报
回复
其实是可以在两个不同的线程中对同一个socket操作的,只不过是需要实现线程同步问题。
概述:宠物智能饲养监测系统基于RT-Thread的ART-PI开发板,主控STM32F750XBH6,支持采集温度、湿度和光照数据,实现高温本地和远程预警,智能照明控制,实时采集数据并通过 WIFI 上传云端,针对智能宠物管理提供一个较好的使用范例,也是自己借参加本次活动,首次实操使用RT-Thread rtos,实现功能是次要目的,学习和使用rtt是初衷,之后本项目会继续增加新功能,简单来说这是一个比较实用的。 开发环境硬件:ART-PI 扩展板:DHT11温湿度传感器,BH1750光照传感器和灯控模块 RT-Thread版本:RT-Thread V 4.0.3 开发工具及版本:RT-Thread-studio v2.0.0,STM32CubeMX v6.1.0 RT-Thread使用情况概述内核部分:调度器。 调度器:创建多个线程来实现不同的工作。 组件部分:I2C框架, Sensor框架, SAL 套接字抽象层 I2C框架:使用I2C框架来驱动光照传感器,上层代码可以提高代码的可重用性。 Sensor框架:为上层提供统一的操作接口,提高上层代码的可重用性;简化底层驱动开发的难度,可以非常简单的读取传感器采集数值。 SAL 套接字抽象层:组件完成对不同网络协议栈或网络实现接口的抽象并对上层提供一组标准的 BSD Socket API,这样开发者只需要关心和使用网络应用层提供的网络接口,而无需关心底层具体网络协议栈类型和实现,极大的提高了系统的兼容性,方便开发者完成协议栈的适配和网络相关的开发 软件包部分: Webclient: 提供设备与 HTTP Server 的通讯的基本功能,主要使用http post。 BH1750FVI: 该传感器软件包提供了使用光照强度传感器基本功能,BH1750FVI 是一种用于两线式串行总线接口的数字型光强度传感器集成电路,具有较高的分辨率可以探测较大范围的光强度变化(范围: 1lx-65535lx),特别适合对光照环境要求较高的场景。 硬件框架ART-PI采集到数据上传到云端(目前使用自己php+mysql,断网本地存储测试中)。 软件框架说明上电初始话后,检测传感器变化,满足设定条件的,通过wifi上传到服务器端 目前服务器端只提供数据处理和存储 软件模块说明bh1750_thread_entry: 光照传感器线程 dht11_thread_entry:温湿度传感器线程 user_webclient_post:http_post main:led 闪烁,用来检测当前系统的运行状态。 演示效果视频演示比赛感悟首先非常感谢RTT和电路城以及ST等一起举办的这次活动。 由于第一次使用M7核mcu以及第一次使用rtt操作系统,从小白一步一步学习,测试,看文档,请教,虽然目前还是小白水平,但是确确实实是一次难得的机会,不亲自实践就永远不知道自己的水平在哪,也不能了解rtt便捷。不得不说,结束rtt studio之后,使用起来非常顺手,再者H750 480MHz搭配art-pi强悍的设计,用于之后的复杂功能开发测试有巨大的升级空。 这次比赛不仅仅是学到了,rtt stm32的软硬件知识,更多的是和许多志同道合的小伙伴,讨论与分享自己的所获所得,这也是一种开源精神。 最后要说声抱歉,鉴于没有充分认识到自己有限的水平,虽然近一个月的时,还只能写出这样的水平,心比天高无奈水平一般,但是这是一个开始,会围绕设计主题,做持续的更新,不断学习和实践,继续让art-pi发光发热。 感谢!!!

18,356

社区成员

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

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