Re: [問題] winsock listen 多個 port
※ 引述《lchbird.bbs@ptt.cc (新手上路)》之銘言:
> 最近使用程式寫簡單的 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: uranus@it.muds.net
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
推
11/02 00:31, , 1F
11/02 00:31, 1F
討論串 (同標題文章)
完整討論串 (本文為第 3 之 3 篇):
Programming 近期熱門文章
PTT數位生活區 即時熱門文章