作者tomex (Tomex Ou)
看板C_Sharp
标题[原创]实作Linux下的UDP Server
时间Sun Mar 9 00:55:39 2008
一年多前,我使用C++土法练钢式实作UDP Listeing於Window32上
用它来大量传输影像资料。
由於UDP速度快却无正确性保证,
因此得自己实作环状伫列来使用固定长度的buffer收取udp资料
并作资料正确性的比对。
单是实作环状伫列很就痛苦,更别说要parsing资料,
不用crc checksum,因为它太慢
比对过程中也因为unsigned char的正负号位元,
因为於网路传输错乱而花了很久时间debug。
这星期,我使用C#.NET实作了TCP Server於WinCE上
老实说这没什麽难的,只要注意.NET Compact Framework不支援的类别即可
网路封包资料的收取没有问题。
接下来,就要实作UDP Server,
当然柿子不会挑软的吃,我实作c#在Linux平台上,
粉碎c++/c独占linux平台的独占空想。
幸亏mono平台1.2.6核心已大概支援.NET 2.0的网路类别
而写个能收UDP Socket比TCP Server更简单
但大部分程式设计师大概就这样沾沾自喜而不自前的
更加无视UDP传输正确性无保障的理论基础,
因此实作出自订检查UDP封包的机制是必须的,否则就不要玩UDP.
UDP不保证封包顺序及资料长度,因此必须实作buffer来累积udp封包数
c#中的stream类别很适合作这些暂存,但它不支援清除已parsed过的资料
终将会把记忆体爆掉。
把以前的环状伫状演算重施故计,
但它的架构就是无法避免阵列结尾的资料missing
找了很久资料,发现这真正技术点的参考乏善可陈
在试过很多资料结构算法後,勉强绑上一个算是满意的queue来实用。
区分技术点如上图:
1. 这部分看一下书大概1小时就搞定udp的server/client传送方式。 难度: 3%
2. 支援连线session,以ip来区分不同的连线,并记录ip,利用thread timer记录
TimeToLive时间。难度: 5%
3. 无验证的资料通通依ip塞入环状streaming。 难度: 40%
设计udp封包的验证结构,并实作过滤queued中的资料。 难度:40%
(这部分要看unsafe及win32与.net的型别互换、记忆体置换、二进位序列化等技术才行)
4. 使用event/非同步方式在udp listener各触发时机接驳到上层的呼叫event。难度: 3%
新增资料进mysql, provider平台测试。难度: 5%
5.设计console下的结束密码。难度2%
6. UDP Client程式。难度: 2%
http://forum.dabutek.com/showthread.php?t=18406
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.168.96.91
1F:推 sss2500:推一个 粉碎c++/c独占linux平台的独占空想~ XD 03/09 08:48
2F:推 gardenest:高手问~必推^+++^ 03/09 22:56
3F:推 KENyroj:高手... 囧 不知能否分享高手的程式?? XD 03/10 09:46
4F:推 saitoh:我用mono的经验是:简单的小程式可以,稍微大一点的就... 03/10 10:05
5F:→ tomex:mono的确在细微处跟win32不同,因此我尽量挑socket/file或中 03/10 15:07
6F:→ tomex:性的类别来实作,减少不相容的现象。v1.2.6版愈来愈成熟了 03/10 15:07
7F:推 horngsh:不知道MONO的.Net 2.0的相容性如何? 如有90%就很棒了. 03/10 16:37