大家好,我有一个关于多线程和socket的问题,困扰我很久了。。。

relive_7 2010-07-02 06:02:32
大家好,我现在碰到一个问题,请大家帮我想想办法:
现有界面程序A,A里面有n个socket client,界面程序A可以设置每个client的ip地址,如果设置了ip地址,那么这个client就向局域网内发起连接,若此时局域网内有server在监听该ip,那么连接成功,他们之间会进行通讯。现在头疼的是有一个要求,界面程序A定时的检查这n个socket client连接是否连通,如果不连通,那么定时重新发起连接。

一开始我是用界面程序A完成定时检查功能的,但是在检查时,界面程序A进入假死状态(因为程序在后台进行连接操作,此时用户不能操作界面)。
1.于是我想到了多线程,假设现在有界面线程A1,通信线程A2,A2如何管理n个socket client的通信,采用什么方式,阻塞还是非阻塞方式通信?

2.如果使用非阻塞模式通信,就需要用到消息队列,查了查资料,线程中的ui线程有消息队列,但是我不知道能不能用ui线程接收到不同socket的数据?有哪位大大用过?

3.如何设计才能满足,用户在界面程序A1上选择某个socket后发送一些数据,通信线程A2该如何操作才能完成用户在界面程序A1上发送数据的操作?

4.怎么样设计才能让通信线程A2完成定时检查socket连接状态的功能,而不影响通信线程A2正常接收各个socket的数据?


先谢谢大家的回复了!!!
...全文
101 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xgPaul 2010-07-03
  • 打赏
  • 举报
回复
1,采用非阻塞,阻塞容易使界面死掉
2,可以收到不同socket的数据,把每个socket都关联一个event,当有数据到来时,就会相应该event。
3,可以选用事件选择模型
4,使用心跳包来进行判断。。。
lijianli9 2010-07-02
  • 打赏
  • 举报
回复
1:使用阻塞容易控制,但是非阻塞性质的灵活。
2:你可以用sendmessage消息给UI线程发消息,自定义消息。
3:通信线程定时检测每个SOCKET是否有数据可读和可写,用select模型,
4:用select也可以,也可以用心跳包的方式,

来灵 2010-07-02
  • 打赏
  • 举报
回复
楼主的确被困扰得头疼了,发了重贴,理解!偶以前也干过
1楼的回答不错啊
jenf 2010-07-02
  • 打赏
  • 举报
回复
恩 确实是发了两个贴!!
雪影 2010-07-02
  • 打赏
  • 举报
回复
lz为这问题发两贴了~~

1.多个套接字管理一般使用非阻塞通信方式
2.可以,自定义消息。接收到数据之后放入一个链表中,通知UI线程处理,UI线程可以通过链表获取Socket数据
3. 通过应答机制,对方收到数据之后发送一个应答数据,确认数据发送成功。Socket接收到应答之后再通知UI线程
4.使用心跳包,定时发送数据获取应答,确认Socket连接正常。不正常的话重连

18,356

社区成员

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

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