WSAAsyncSelect如何启动线程,救救我吧

liulin2018 2012-09-03 07:37:03
服务器是基于WSAAsyncSelect模型下开发的, 只需要应付10个以内的套接字,所以那些说iocp啥的勿扰。谢谢



服务器有个功能:转发客户端发送过来的文件 , 当收到客户端传送来的文件的时候,就转发给目标客户端

说白了就是类似飞鸽传书的功能(飞鸽是没有服务器的,我这里有,这是区别)



设计, 封装了一个包(含缓冲区大小,数据类型, 文件名字,文件格式等信息)

,服务器收到后,则转发。


如果有多个客户端,如:a b c这三个客户端,当ab 发送文件给c的时候,由于服务器只有一个接受线程,那么就有一种可能性:

一个很长的时间段里,只收到a或者只收到b的发送来的文件。


这样是不好的, 那么我该怎么办呢?

或许有人回答 应付a, b两个客户端,那么你就开启2个线程来接受,

我的问题是,什么时候开启呢?

WSAAsyncSelcet是基于消息的,我是采用mfc的CAsyncSocket(这个类封装了WSAAsyncSelect类)

什么时候关闭线程呢?



...全文
170 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
凝云 2012-09-04
  • 打赏
  • 举报
回复
调用mfc的WindowProc消息函数,把WSAAsyncSelect函数中最后的参数设置如读写等,在WindowProc中获得,这样就可以来多少个客户端都没关系。因为CAsyncSocket本身就是一个线程窗口类
「已注销」 2012-09-04
  • 打赏
  • 举报
回复
其实。我觉得不用再开线程。。
liulin2018 2012-09-04
  • 打赏
  • 举报
回复
俺不专业和啊

你评价 一下3楼的思路对不对啊


[Quote=引用 7 楼 的回复:]

你应该说是文件端口,聊天端口……
[/Quote]
「已注销」 2012-09-04
  • 打赏
  • 举报
回复
你应该说是文件端口,聊天端口……
liulin2018 2012-09-04
  • 打赏
  • 举报
回复
3 楼的思路如何啊
liulin2018 2012-09-03
  • 打赏
  • 举报
回复
404 恨死你, f5 无数次,才看到帖子,

楼上看3 楼的方案


顺便指点一下,
Gloveing 2012-09-03
  • 打赏
  • 举报
回复
我的问题是,什么时候开启呢?
连接消息来的时候,就开启
什么时候关闭线程呢?
收发放到线程中,收发完毕线程函数返回就自己结束了
liulin2018 2012-09-03
  • 打赏
  • 举报
回复
你说的是一种法子:

可否这样:客户端有一种套接字(姑且叫非文件套接字,用以接受非文件类型的数据)

还有一种,是用来发送文件的,叫文件套接字

客户端 和服务端有长连接和短连接。

长连接是 心跳包,这些功能,发送聊天内容这些功能。

短连接:则是 针对传送文件涉及的。

客户端想发送文件的时候,则去连接服务器的文件监听套接字,连接后,则开启一个接受文件的线程

开始recv数据, 然后转发出去.


这里涉及到一个问题了:

客户端a,客户端b发送文件给客户端c, 客户端c何时去短连接服务器呢(它是被动连接的,对吧,客户单和服务端

保持着2中tcp连接,一种是文件短连接,一种是非文件的长连接)

客户端a可以发送一个长连接的包告知客户端c,让客户端c和客户端a都创建 文件套接字,

然后去连接到 服务器上。如果短连接套接字连接了,那么就不要连接!!!

一旦连接上,就开辟线程。









[Quote=引用 2 楼 的回复:]

引用楼主 的回复:
服务器是基于WSAAsyncSelect模型下开发的, 只需要应付10个以内的套接字,所以那些说iocp啥的勿扰。谢谢



服务器有个功能:转发客户端发送过来的文件 , 当收到客户端传送来的文件的时候,就转发给目标客户端

说白了就是类似飞鸽传书的功能(飞鸽是没有服务器的,我这里有,这是区别)



设计, 封装了一个包(含缓冲区大小,数据类型, ……
[/Quote]
Eleven 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
服务器是基于WSAAsyncSelect模型下开发的, 只需要应付10个以内的套接字,所以那些说iocp啥的勿扰。谢谢



服务器有个功能:转发客户端发送过来的文件 , 当收到客户端传送来的文件的时候,就转发给目标客户端

说白了就是类似飞鸽传书的功能(飞鸽是没有服务器的,我这里有,这是区别)



设计, 封装了一个包(含缓冲区大小,数据类型, 文件名字,文件格式等信息)……
[/Quote]
你accept一个客户端的连接的时候,就可以启动一个线程,在这个线程中收发数据即可。
dickbarry 2012-09-03
  • 打赏
  • 举报
回复
飞鸽是收文件是收完一个收另一个,但允许多用户同时收;


或许有人回答 应付a, b两个客户端,那么你就开启2个线程来接受,
我的问题是,什么时候开启呢


客户端链接过来的时候就开启

WSAAsyncSelcet是基于消息的,我是采用mfc的CAsyncSocket(这个类封装了WSAAsyncSelect类)
什么时候关闭线程呢?


对方关闭socket的时候退出

18,356

社区成员

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

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