看板Programming
标 题Re: [问题] winsock listen 多个 port
发信站政大狂狷年少 (Wed Nov 1 07:16:51 2006)
转信站ptt!ctu-reader!ctu-peer!news.nctu!news.cis.nctu!news.cs.nthu!WHSHS
※ 引述《[email protected] (新手上路)》之铭言:
> 最近使用程式写简单的 socket 程式,
> 原本是开一个 socket ,只听一个 port。
> 这几天老板要求改成可听多个 port ,
> 虽然硬改出来了,但不知道是不是一个好的方法,上来请教大家。
> 原本听一个 port 时,每一个 connection 就会再生一个 thread 去处理。
> 因为是 console 下 blocking mode ,所以一个 port 时还好。
> 要多个 port 时,使用了一个 port 就给一个 thread 去听,
> 而每个 port 的每个 connection ,都会再生出一个 thread 去处理。
> 请问各位,有没有人有类似的经验?又,这类「听多个 port 」的程式大部份
> 都是怎麽处理的?
> 小弟试着去找 linux 下 sshd 的程式码来看,因为它在使用上也可以开启多个
> port ,有看到里面用到 pthread ,但不知道它是用在哪里部份的,也没有明确
> 的看到它如何处理开启多个 port 的部份。
> 谢谢!
我用的不是 winsock,
但原理应该都大同小异。
要听多个 ports 当然是用 thread 写起来比较顺,
反正又不是多一个 thread 你就要多写一行 code 去生 thread。
总之就跟你说的一样,
丢一个 thread 去听,
接到连线就再生 thread 去处理,
原本的 main thread 继续做自己的事。
不然天晓得你老板哪天又说你的程式要能主动 send 资料出去,
那你就又有得忙了,
因为不用 multi-thread 又不用 multi-process 的话,
你程式的 response time 就很容易会在中等负载下变得很糟糕,
而且要是老板要求的是每隔一分钟主动 send 一次资料出去,
结果每次都超过一分钟才送而且时间都不固定,
最後就只能在那边等着被老板惨电到死;
因为你只有一个 process 一个 thread,
要是某个 connection 的 request 要让你做很久,
其它 connections 的 requests 就会等不到你回应,
然後你就又要忙着去看怎样弄个 timeout 机制来搞定这问题,
可是这种东西 multi-thread 环境有 thread scheduler 帮你搞定,
multi-process 环境有 process scheduler 帮你搞定,
最後只会做了一堆白工浪费时间而已。
拿 UNIX 常见的 I/O 多工函式 select() 来说,
要是你的程式除了被动的从各 connections 收到 request 後才动作之外,
还需要主动做一些事情,
那你就不可能让 select() 一直卡在那边不动,
於是你会有 blocking 跟 non-blocking 两种选择。
如果你选了 blocking,
那你就要设定一个合理的 timeout 给 select(),
让它等某段时间都没收到 socket I/O 的话,
就会强制 return 并开始做程式本身该主动做的事,
要是这些该主动做的事情有可能做很久,
以致於连线到你程式的人开始怀疑你的程式是不是挂了,
或是觉得怎麽每次连过去都要等好几秒才有回应,
这样就很不好,
於是你可能会挖出 alarm() 什麽的来帮你计时,
时间到了送给你程式一个 signal 叫你回去 select() 看有没有连线进来,
结果你又要花时间去写 signal handler,
这後面还有很多讲不完的故事。
如果你选了 non-blocking,
故事还是跟 blocking 的情形差不多,
只是变成从上面那段的第五行开始,
到最後发现当初不选 thread 或 process 的方法来做真不应该,
可能也已经花掉你不少时间了。
不过并不是说用 thread 和 process 就无敌了,
你还是要学好一些基本观念,
不然用 thread 撞上 race condition,
用 process 搞不清楚哪些东西会由 parent 继承给 child,
processes 间互传资料也要学一点简单的 IPC,
不是直接冲了就好了的,
但确实能让你少做不少白工。
--
Name: Tseng, Ling-hua E-mail Address:
[email protected]
School: National Tsing Hua University Department: Computer Science
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Undecided
Homepage:
https://it.muds.net/~uranus
--
╔═══╗ ┼────────────────────────╮
║狂狷 ║ │
* Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮
║ 年少║ ┼╮
< IP:140.119.164.252 > ╰─╮
╚╦═╦╝ ╰
* From:61-230-217-167.dynamic.hinet.net
─╨─╨─ KGBBS ─ ◎ 遨翔"BBS"的狂狷不驯;属於年少的轻狂色彩 ◎
[修改]tinlans:61-230-217-167.dynamic.hinet.net 06/11/01 7:16:51
1F:推 lchbird:感谢~ 203.72.87.167 11/02 00:31