socket连接多客户端问题,如何用一个线程与多个客户端连接起来,求指教啊

u010020198 2013-07-18 07:34:52
今天用一客户端一线程的方法解决了一个服务器对应多个客户端,但是老大又说不能创建如此多的线程,于是让我用select函数改成几个线程就能完成几十个客户端连接上来并传输文件的。。。
今天看了一天的select函数,select的功能不是监控很多的套接字是否有要读的或要写的东西吗?也就是它管理着几十个套接字然后任何一个套接字要读写都会告诉它,然后他把这个套接字交给线程处理吗?可最终还是要很多线程啊。。。是不是我理解错误了,求指教。。。
...全文
533 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
大尾巴猫 2013-07-18
  • 打赏
  • 举报
回复
#10回复 select模型我不熟悉,没用过,具体就不清楚了。 我只会iocp模型。
大尾巴猫 2013-07-18
  • 打赏
  • 举报
回复
#9回复(我的浏览器楼层引用不能用) 你的例子,每个socket和相应的文件名肯定要一一对应。 在任何服务器的模型中,每种资源都必须有效控制,包括每个socket,每个buff缓冲区等,必须用数组或者链表或其他数据结构存贮。
u010020198 2013-07-18
  • 打赏
  • 举报
回复
引用 8 楼 ananluowei 的回复:
用了select,就不需要每个socket开1个线程了 做个循环,遍历每个socket,用FD_ISSET检测是否有信号,有了就send,recv等操作,继续下一个socket的检测 你要分清楚阻塞IO和非阻塞IO,或者叫同步和异步IO 以recv为例,同步recv,如果对方10秒没信号,函数必须等待10秒,等到对方发送,你收到了才能继续执行下去,所以1个socket需要1个线程。 异步IO,select会告诉你有信号了,你去遍历,就知道那个socket可以recv,然后去执行recv,完成后可以继续select,多个socket只需要1个线程。
还有个问题,select函数每次遍历完之后都会使用FD_SET(*fdset),但是我那些套接字其实还没传完,当客户端第二次传送的时候集合里已经把套接字都清空了,它肯定检测不到客户端要传输的信号,难道每次都要重新连接一次?是不是我理解错误了?但是不清空的话它就会认为有信号然后直接进入recv……谢谢
u010020198 2013-07-18
  • 打赏
  • 举报
回复
引用 8 楼 ananluowei 的回复:
用了select,就不需要每个socket开1个线程了 做个循环,遍历每个socket,用FD_ISSET检测是否有信号,有了就send,recv等操作,继续下一个socket的检测 你要分清楚阻塞IO和非阻塞IO,或者叫同步和异步IO 以recv为例,同步recv,如果对方10秒没信号,函数必须等待10秒,等到对方发送,你收到了才能继续执行下去,所以1个socket需要1个线程。 异步IO,select会告诉你有信号了,你去遍历,就知道那个socket可以recv,然后去执行recv,完成后可以继续select,多个socket只需要1个线程。
这个我明白,但是假设有5个客户端连上来都上传100M的文件,假设都要100次才能传完,服务器是接受套接字写回本地,但五个客户端第一次发送过来的套接字要收到回应才继续发第二个的,所以服务器很可能接收了五个客户端A,B,C,D,E的序号为1传送过来的套接字,分别写入到a.txt,b.txt,c.txt,d.txt,e.txt当A又发来序号为2的套接字时一个线程怎么区分要写入到哪个文件里,是不是应该定义个数组把socket和文件名对应起来?
大尾巴猫 2013-07-18
  • 打赏
  • 举报
回复
用了select,就不需要每个socket开1个线程了 做个循环,遍历每个socket,用FD_ISSET检测是否有信号,有了就send,recv等操作,继续下一个socket的检测 你要分清楚阻塞IO和非阻塞IO,或者叫同步和异步IO 以recv为例,同步recv,如果对方10秒没信号,函数必须等待10秒,等到对方发送,你收到了才能继续执行下去,所以1个socket需要1个线程。 异步IO,select会告诉你有信号了,你去遍历,就知道那个socket可以recv,然后去执行recv,完成后可以继续select,多个socket只需要1个线程。
www_adintr_com 2013-07-18
  • 打赏
  • 举报
回复
一个线程可以在发现有读写请求后自己进行处理, 处理完了在继续下一轮的查询. 不是说有几十个客户端同时在传文件, 就需要每个客户有单独的线程才能够随时响应的. 如果你只有一个 CPU, 一个线程在操作的时候, 其余的线程一样在等待的. 不用担心客户端感觉到的服务器响应是否及时的问题, 操作系统会为你缓冲客户端上传上来的数据的. 通常来说, 你写入文件的速度会比网络传输的速度快, 所以, 即使只有一个线程, 它也是随时等待在端口查询上的. 真正进行写入文件操作的时间并不多, 客户端不会感觉延迟.
max_min_ 2013-07-18
  • 打赏
  • 举报
回复
引用 5 楼 u010020198 的回复:
[quote=引用 3 楼 max_min_ 的回复:] 十几个客户可能是同步上传文件么? select 函数只是监听是否有准备号的提套接字来进行I/O操作(个人理解)。 应该是多可客户上来,都是某一个线程进行I/O操作
这是假设的场景,但是确实是有这个可能的,这个我不怀疑,只是一个线程进行io操作怎么处理几十个客户端,这几十个客户端都是要上传文件的,我刚开始时每当一个客户端上来我就开辟一个线程给他读写,这样子就会有几十个线程在读写,现在如果我只用一个线程读写,那么我怎么把那么多的套接字放到线程上去,而且我该怎么区分那个套接字在上传哪个文件,要求文件是100m左右的,所以不可能一次发送完[/quote] 如果真是这样的话,可以试试用一个链表来保存准备好的套接字,然后在一个线程里进行一个一个套接字的I/O操作,当然最好加上读写锁操作。
u010020198 2013-07-18
  • 打赏
  • 举报
回复
引用 3 楼 max_min_ 的回复:
十几个客户可能是同步上传文件么? select 函数只是监听是否有准备号的提套接字来进行I/O操作(个人理解)。 应该是多可客户上来,都是某一个线程进行I/O操作
这是假设的场景,但是确实是有这个可能的,这个我不怀疑,只是一个线程进行io操作怎么处理几十个客户端,这几十个客户端都是要上传文件的,我刚开始时每当一个客户端上来我就开辟一个线程给他读写,这样子就会有几十个线程在读写,现在如果我只用一个线程读写,那么我怎么把那么多的套接字放到线程上去,而且我该怎么区分那个套接字在上传哪个文件,要求文件是100m左右的,所以不可能一次发送完
u010020198 2013-07-18
  • 打赏
  • 举报
回复
引用 2 楼 ananluowei 的回复:
select函数返回告诉你有某个套接字可以读或者写了或者连接或者断开等 然后用FD_ISSET(s,*set)检查某个套接字是否有信号 也就是遍历你所管理的那么多套接字,每个套接字用FD_ISSET测试下,如果返回true,判断套接字的状态,针对这个套接字进行读或者写或者连接和关闭。只需要1个线程,当然也可以多个线程同步处理,不会需要几十个线程那么多。 select模型我也没用过,看了书,然后这么理解的。
我也是这么理解的,但是老大那样说我也没办法,他说select可以做到,我又只是个实习生,连socket都是刚学,只能说我回去试试先。。。 几十个线程是指同时又几十个客户端连接上来,select就会检测到几十个套接字,这些套接字都是要上传文件的,所以我就不知道怎么用几个线程来控制那么多客户端上传……
max_min_ 2013-07-18
  • 打赏
  • 举报
回复
十几个客户可能是同步上传文件么? select 函数只是监听是否有准备号的提套接字来进行I/O操作(个人理解)。 应该是多可客户上来,都是某一个线程进行I/O操作
大尾巴猫 2013-07-18
  • 打赏
  • 举报
回复
select函数返回告诉你有某个套接字可以读或者写了或者连接或者断开等 然后用FD_ISSET(s,*set)检查某个套接字是否有信号 也就是遍历你所管理的那么多套接字,每个套接字用FD_ISSET测试下,如果返回true,判断套接字的状态,针对这个套接字进行读或者写或者连接和关闭。只需要1个线程,当然也可以多个线程同步处理,不会需要几十个线程那么多。 select模型我也没用过,看了书,然后这么理解的。
u010020198 2013-07-18
  • 打赏
  • 举报
回复
我觉得select函数仅仅负责监控已经连上的套接字是否要读写或者有其他的套接字请求连接

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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