??xml version="1.0" encoding="utf-8" standalone="yes"?>
Winsock 扩展函数 AcceptEx 是唯一能够使用重叠 I/O 接受客户q接的函数。下面主要深入探讨用该函数接收q接的问题?
前面已经讨论q,当客戯接进来时Q服务器需要创Z个套接字来负责维护与一个客L(fng)的会(x)话。?AcceptEx 函数之前必须创徏一些套接字Qƈ且这些套接字必须是未l定、未q接的,即它们可能在调?TransmitFile, TransmitPackets, ?DisconnectEx 后可以重用?
响应服务器必LLh_?AcceptEx 在站岗,以便在有客户q接h时调用。但是,q没有具体的数量能够保证服务器能够立卛_应连接。我们知道在调用 listen 监听套接字|于监听状态后Q?TCP/IP 堆栈?x)自动接受到来的q接Q直到达?listen ?backlog 参数讑֮的限制。对?Windows NT 服务器而言Q支持的 backlog 的最大gؓ(f) 200 。如果服务器投递了 15 ?AcceptEx 调用Q然后突然有 50 个客戯求连接服务器Q它们的q接h都不?x)遭到拒l。服务器投递的 AcceptEx I/O ?x)满_面的 15 个连接,剩下?35 个连接都被系l默认连接了。检查一?backlog 的值发玎ͼpȝq有能力默认接受 165 个连接。之后,如果服务器投?AcceptEx 调用Q它们会(x)立即成功q回Q因为系l会(x)默认接收的q接攑օ ?{待q接队列 ?中?
服务器的Ҏ(gu)是军_要投递多个 AcceptEx 操作的重要因素。例如,希望处理大量短时间即时连接的客户要比处理量长时间连接的客户投递更多的 AcceptEx I/O 。一个好的策略是允许 AcceptEx 的调用数量在最值和最大g间变化。具体做法是Q应用程序跟t未决的 AcceptEx I/O 的数量,当一个或多个 I/O 完成使这个未?I/O 数量变得比最D时Q就再投递额外的 AcceptEx I/O ?
?Windows 2000 和以后的 Windows 操作pȝ版本中, Winsock 提供了一U机Ӟ用来定应用E序是否投递了_?AcceptEx 调用。创建监听套接字Ӟ使用 WSAEventSelect 函数为监听套接字兌一个事件对象,注册 FD_ACCEPT 事g。如果投递的 AcceptEx 操作用完Q但是仍有客戯求接入(pȝҎ(gu) backlog 值决定是否接受这些连接)Q事件对象就是受信,说明应该投递额外的 AcceptEx 操作了。这实际上还是利用事件对象来使调用线E处于一U??可警告状??Q当有客戯接请求时Q就Ҏ(gu)当前 AcceptEx 操作是否用完来警告(通知Q是否需要投递新?AcceptEx 操作来处理新的客戯接?
使用 AcceptEx 处理q接的另外一个功能就是在处理q接时还可以接收用户发来的第一块数据(前提是ؓ(f) AcceptEx 提供了接收缓冲区Q,q对于那些请求连接的同时发送了一些数据过来的客户来说很适用。但是,此时Q除非接收连接的同时接收C客户发送过来的一些数据,否则 AcceptEx 是不?x)返回的?
Z满客户的需求,服务器不得不投递更多的接受 I/O Q这?x)占用大量的pȝ资源。如果客户仅调用 connect 函数q接服务器,长时间既不发送数据,也不关闭q接Q就可能造成 AcceptEx 投递的大量重叠 I/O 操作不能q回。这是 ?恶意q接 ?。ؓ(f)此,服务器应该记录每?AcceptEx 投递的未决 I/O, 定时扫描它们Q设|?SO_CONNECT_TIME 参数调用 getsockopt (g)查它们连接的旉Q如果超Ӟ将q接关闭。如果?WSAEventSelect 模型来通知有连接事Ӟ则当事g受信Ӟ是检查客户套接字Q?AcceptSocket Q是否真正连接了?
每当调用 AcceptEx 接受客户端连接时Q它也在{待接受客户发送过来的W一个数据块Q这时不允许投递另外一?AcceptEx 。当 AcceptEx q回后,如果事g对象再次受信则表明有新的q接到来。需要注意的是,无论何时Q千万不要关闭一个调?AcceptEx q没有返回的套接字( AcceptSocket Q,因ؓ(f)q会(x)D内存泄露。因Z内部执行逻辑看,当没有连接的套接字句柄被关闭Ӟ调用 AcceptEx 所涉及(qing)到的内核模式的数据结构ƈ不会(x)清除掉,直到有新的连接徏立或者监听套接字被关闭?
管在一个等待完成通知的工作者线E中Q投递一?AcceptEx 操作Q看h既简单又合情合理Q但是应量避免q样做,因ؓ(f)创徏套接字还是很耗费资源的。另外,也不要在工作者线E中q行M复杂的计,以便处理器可以尽快的在接到完成通知后进行后l处理。创建套接字耗费资源的一个原因在?Winsock 2.0 本n的架构很复杂Q成功地创徏一个套接字可能需要调用很多内核服务。因此,服务器应该在单独U程中创建套接字Q投?AcceptEx 操作。当调用U程投递的 AcceptEx 重叠操作完成Ӟ一个受信的事g会(x)通知处理U程?
6.2.2 数据传输问题
数据传输是通信E序执行的核心操作。当一个客户与服务器徏立连接后Q它们的主要工作是传输数据Q因为数据是信息的表C。由上一节几U?I/O 模型的性能试分析可知Q当q接数量很大Ӟ数据吞吐量是一个重要的性能考核指标?
从性能角度考虑Q所有的数据传输最好都应采用重?I/O 处理。默认情况下Q系lؓ(f)每个 socket 分配一个的接受~冲区和一个发送缓冲区Q用来缓存接收和发送的数据。但在重?I/O 中,q些~冲区往往不用Q可以传递参?SO_SNDBUF ?SO_RCVBUF 调用 setsockopt Q来它们设|ؓ(f) 0 ?
让我们来看看Q当发送缓冲区没有讄?0 Ӟpȝ是怎么处理一个典型的 send 操作的。当一个应用程序调?send 函数Ӟ如果有充的~冲I间Q需要发送的数据被拯到套接字的发送缓冲区Q?send 函数立即成功q回Qƈ且一个完成通知被抛出。另外一个方面,如果套接字的发送缓冲区已满Q则应用E序提供的发送缓冲区被锁定,再次?send 函数的调用将?x)返?WSA_IO_PENDING 错误。当发送缓冲区中的数据被处理(例如Q提交给传输层处理)Ӟ Winsock 实际上直接处理锁定在~冲Z的数据,也即l过套接字的发送缓冲区Q直接从应用E序~冲Z提交数据l传输层?
接收数据的情冉|好相反。当一个重叠的 receive h抛出后,如果数据已经接收成功Q它?x)被~存在套接字接收~冲区。数据会(x)拯到应用程序缓冲区Q直到饱和)?receive 调用q回Qƈ且一个完成通知被抛出。当套接字缓冲区被设|ؓ(f)I时Q如果调用重叠的 receive 操作返?WSA_IO_PENDING 错误。当有数据到达时Q它?yu)绕q套接字~冲直接被拯到应用程序缓冲区?
讄单套接字~冲Zؓ(f) 0 Qƈ不能提高性能Q因为只要一直有大量的重叠接发请求被抛出Q就不会(x)有额外的内存拯。设|套接字发送缓冲区为空比设|套接字接收~冲Zؓ(f)I对pȝ的性能影响要小。因为应用程序的发送缓冲区?x)被l常锁定直到它被提交l传输层处理。然而,若将接收~冲|ؓ(f) 0 Qƈ且没有重叠的 receive 调用QQ何传q来的数据只能缓存在传输层。传输层驱动E序只会(x)~存滑动H口寸的数据,?17KB?传输层可以分配的~冲区大的上限。实际的~冲?17KB 。传输层~冲区(针对一ơ连接)是在非分|之外分配的,q意味着Q当服务建立?1000 个连接时Q即使没有抛?receive hQ非分页池中也会(x)分配 17MB 的内存。而非分页池是很珍늚资源Q除非服务器可以保证L有接收请求抛出,否则套接字接收缓冲区应该不需讄?
只有在一些特D情况下Q对套接字接收缓冲区不予讄会(x)D性能降低。考虑服务器需要处理成千上万个客户q接Q而每个连接上又都没有投?receive h的情况,如果客户端零星地发送数据过来,传输q来的数据将被缓存在套接字接收缓冲区中。当服务器处理一?receive 重叠 I/O Ӟ它会(x)做一些不必要的工作。当完成通知到达Ӟ重叠操作?x)处理一?I/O h包( IRP Q。在q种情Ş下,服务器不能保留很多抛出的 receive h。因此,最好用简单的非阻塞接收函数?
6.3 内存资源理问题
׃机器g条g所限,pȝ资源是有限的Q因此不得不考虑内存资源的管理问题。从上一节对不同 I/O 模型q行的性能试l果分析可知Q维持大规模的通信q接Q不仅会(x)耗费掉大量内存,而且?CPU 的占用也是很高的?
对于配置比较高的服务器而言Q处理成千上万个q接q不成问题。但是随着q接量的剧增Q内存资源的限制逐渐凸现。最有可能遇到的两个限制因素是锁定和非分|。锁定页的限制不是太严重Q更应该避免的是非分|被耗尽。每一ơ调用重叠的 send ?receive hQ提交的~冲区都可能被锁住。当内存被锁定时Q它?yu)׃能从物理内存换出。操作系l对锁定内存的数量是有限制的Q当辑ֈ极限Ӟ重叠操作会(x)q回 WSAENOBUFS 错误。如果服务器在每个连接上投递多个重叠接收操作,随着客户q接数量的增多,极限׃(x)辑ֈ。如果期望服务器能够处理高ƈ发通信Q服务器可以在每个连接上投递一?0 字节的接受操作,q样׃?x)有内存锁定?0 字节的接受完成以后,服务器可以简单地执行一个非d的接收函数来获取~存在套接字接收~冲Z的所有数据。当非阻塞接收调用返?WSAEWOULDBLOCK ӞpCZ再有未决的数据了。这U方法非帔R合用来设计那些希望通过牺牲每个套接字上的吞吐率来获取更大规模ƈ发连接的服务器?
当然Q最好还要了解客L(fng)与服务器通信的方式。在上面的例子中Q当 0 字节的接收完成后Q再投递一个异步接收操作,接收到所有缓存在套接字接收缓冲区中的数据。如果服务器知道客户端将?x)连l不断发送数据,那么?0 字节的接收完成后Q假如客L(fng)发送大数据块(过单套接字~冲?8KB 的容量)q来Q服务器抛Z个或多个重叠的接收操作?
另外一个需要重点考虑的问题就是系l所需늚数量。当pȝ锁定传递给重叠操作的内存时Q它是在边界上q行的。在 x86 体系l构上,内存늚大小?4KB 。如果一个操作投递了 1KB 的缓冲区Q系l实际上?x)?f)它锁?4KB 大小的内存块。ؓ(f)避免q种费Q重叠发送和接收~冲区的大小应该是页大小的倍数。可以?GetSystemInfo q个 API 来获知当前系l页的大?
如果H破非分|极限Q将?x)导致更严重的错误,q且很难恢复。非分页池是内存的一部分Q它帔R内存Qƈ且永q不?x)被交换出去。内核模式的pȝlgQ如驱动E序Q通常使用非分|Q其中包?Winsock 和协议驱动程序,例如 tcpip.sys 。每个套接字的创建将消耗一部分非分页池,用于l持套接字状态信息。当套接字绑定到一个地址后, TCP/IP 堆栈分配额外的非分|来保存本地地址的信息。当一个对{套接字接入后, TCP/IP 堆栈也将分配部分非分|来保存远E地址信息。基本上Q一个徏立连接的套接字占?2KB 非分|内存 , ?accept ?AcceptEx q回的套接字则占?1.5KB 非分|内存。之所以出现这个区别,是因为服务器本地地址信息已经存储在监听套接字中,?accept ?AcceptEx q回的套接字只需保存q程L地址信息。此外,每个在套接字上投递的重叠操作都需要给 I/O h包( IRP Q分配内存,一?IRP 使用大约 500B 非分|内存?
从以上分析可以看出,为每个连接分配的非分|内存q不是很大。然而,随着客户q接量逐增Q服务器寚w分页池的使用是非常大的。考虑q行在只?1GB 物理内存?Windows 2000 或以后版?Windows pȝ上的服务器,有 256MB 的内存非配给非分|。通常Q非分页池大是机器物理内存?1/4 Q?Windows 2000 ?qing)以后版本?Windows pȝ上,非分|大小?256MB Q?/1GB Q,?Windows NT 4.0 限制?128MB Q?1GB Q。拥?256MB 的非分页池的服务器可以支?50,000 或更大的q接量。但是必限刉叠的 accept 数量Q以?qing)在已经建立q接的重叠收发操作。在q个例子中,如果已经建立q接的套接字Q按每个 1.5KB 计算Q将耗费 75MB 的非分页池内存。如果采用了上面提及(qing)的投?0 字节接收的方法,q样为每个连接分配的 IRP 占?25MB 的非分页池内存?
如果pȝ耗尽了非分页池,?x)有两种可能的后果。在最好的情况下, Winsock 调用返?WSAENOBUFS 错误。最p糕的情冉|pȝ崩溃Q这U情况通常是系l没能正处理内存非配的问题造成的。没有一U可行的Ҏ(gu)能够恢复非分|耗尽的错误,q且也没有可行的Ҏ(gu)来监视非分页池可分配的大,因ؓ(f)非分|耗尽Dpȝ崩溃?
׃上探讨,可以得出l论Q没有一U方法可以确定服务器到底支持多大的ƈ发连接和重叠操作Qƈ且也不可能准地L(fng)非分|是否耗尽或者锁定内存页数超q极限。因为它们都导?Winsock 调用都返回相同的错误 —WSAENOBUFS 。因Z上因素,针对服务器的试必须试不同数量的连接情况以?qing)重叠操作完成情况,以便在ƈ发通信规模和数据吞吐率q两个指标之间选择一U折中的Ҏ(gu)。如果在Ҏ(gu)中强加限Ӟ以防止服务器耗尽非分|Q则q回 WSAENOBUFS 错误Ӟ我们q道是因ؓ(f)过了锁定页的限制。ƈ且可以以一U更优化的处理方式编写程序,如进一步限制一些待决的操作或关闭某些连接?
包重新排序问?
q个问题与~性没有多大关联,但是却是实际通信中不得不考虑的一个问题,因ؓ(f)它涉?qing)到能否正确通信的问题?
虽然使用完成端口?I/O 操作L?x)按照它们被提交的顺序完成,但是U程调度问题可能?x)导致关联到完成端口上的工作不能按正帔R序完成。例如,有两?I/O 工作U程Q应该接??字节?1 Q字节块 2 Q字节块 3?Q但是你可能以错误顺序接收这 3 个字节块Q??字节?2 Q字节块 1 Q字节块 3?。这也意味着在完成端口上投递发送请求发送数据时Q数据实际也?x)以错误序被发送出厅R?
当然Q如果只使用一个工作线E,仅提交一?I/O 调用Q是不存在顺序问题的。因为同一时刻Q一个工作线E只能处理一?I/O 操作。但是,q样没有发挥出完成端口的真正优炏V?
如第 3 章《自定义应用层通信协议》所qͼ一个简单的解决Ҏ(gu)是为每个封包添加一个协议头。协议头主要是一个封包的实际字节敎ͼ如自定义 Package 包的W一个字D?m_nCmdLen 是q个包占用的字节数。通信的接受方通过分析协议头分析本ơ通信有多数据要接收Q然后l读后面的数据,直到一个封包被完整接收完才接收下一个封包?
当服务器一ơ仅做一个异步调用时Q上q封包协议头的解x案是很有效的。但是,如果要充分发?IOCP 服务器的潜力Q肯定有多个未决的异步读操作{待数据的到来。这意味着Q多个一步操作不能按序完成Q未册 I/O q回的字节流不能按顺序处理,接收到的字节可能组合成正确的封包,也有可能l合成错误的包。因此,要解册个问题,q必Mؓ(f)提交的读 I/O 分配序列受?
说明Q?
本文主要译自?Network programming for microsoft windows 》一书的 6.2 节《可伸羃的服务器体系l构》和 6.3 节《资源管理》?
其中包重新排序问题,参?王艳q ?Windows |络与通信E序设计 ?4.3.4 节《包重新排序问题??
l果后来太忙?׃直荒废着,一直荒废到现在qQQ农场都快遗忘?,
现在我的分析与源代?(VC++ 6.0) 发出?有兴可以拿ȝI研I?
分析文g里面有关?swf 的编译文?
QQ农场的外挂ƈ不难,主要是要分析的数据比较多,比较难解决的?farmKey 的生?最早的 farmKey 是直接在
farmTime 后面加个字符然后MD5得到,后来又好像改法?刚才又搜索了一?貌似现在是不验证farmKey?
如果真的是不验证?那就比较好办
我当时有个比较好的想法是, 当你要执行你自己的操作时,比如要偷?先点击自q农场,
q时候会(x)发送一个请求信息到服务?
发?70 send: (sock=1888, ,len=70,flags=0)
farmKey=94650692c95593003ca5a334e349020e&ownerId=0&farmTime=1250599404
q时?你可以截取这个数?保存 farmkey,然后在后面修改你要的操作,
q样,无论他算法怎么?你在q里截取farmKey p. 当然如果你能破解farmKey生成当然是最好的
希望对研I这个游戏外挂有所帮助, !!!!!!!!!!
见源?/a>
一两个单概念长q接与短q接Q?br />1.长连?/p>
Client方与Server方先建立通讯q接Q连接徏立后不断开Q?然后再进行报文发送和接收?/p>
2.短连?/p>
Client方与Server每进行一ơ报文收发交易时才进行通讯q接Q交易完毕后立即断开q接。此U方式常用于一点对多点
通讯Q比如多个Clientq接一个Server.
?什么时候需要考虑_包问题?
1:如果利用tcp每次发送数据,׃Ҏ(gu)建立q接Q然后双方发送完一D|据后Q就关闭q接Q这样就不会(x)出现_包问题Q因为只有一U包l构,cM于http协议Q。关闭连接主要要双方都发送closeq接Q参考tcp关闭协议Q。如QA需要发送一D字W串lBQ那么A与B建立q接Q然后发送双斚w默认好的协议字符?hello give me sth abour yourself"Q然后B收到报文后,将~冲区数据接?然后关闭q接Q这L(fng)包问题不用考虑刎ͼ因ؓ(f)大家都知道是发送一D字W?br />2Q如果发送数据无l构Q如文g传输Q这样发送方只管发送,接收方只接收存储就okQ也不用考虑_包
3Q如果双方徏立连接,需要在q接后一D|间内发送不同结构数据,如连接后Q有好几U结构:(x)
1)"hello give me sth abour yourself"
2)"Don't give me sth abour yourself"
那这L(fng)话,如果发送方q箋发送这个两个包出去Q接收方一ơ接收可能会(x)?hello give me sth abour yourselfDon't give me sth abour yourself" q样接收方就MQ到底是要干嘛?不知道,因ؓ(f)协议没有规定q么诡异的字W串Q所以要处理把它分包Q怎么分也需要双方组l一个比较好的包l构Q所以一般可能会(x)在头加一个数据长度之cȝ包,以确保接收?/p>
?_包出现原因Q在传输中出现QUDP不会(x)出现_包Q因为它有消息边?参考Windows |络~程)
1 发送端需要等~冲区满才发送出去,造成_包
2 接收方不?qing)时接收~冲区的包,造成多个包接?/p>
解决办法Q?br />Z避免_包现象Q可采取以下几种措施。一是对于发送方引v的粘包现象,用户可通过~程讄来避免,TCP提供了强制数据立即传送的操作指o(h)pushQTCP软g收到该操作指令后Q就立即本D|据发送出去,而不必等待发送缓冲区满;二是对于接收方引L(fng)_包Q则可通过优化E序设计、精接收q程工作量、提高接收进E优先{措施,使其?qing)时接收数据Q从而尽量避免出现粘包现象;三是由接收方控制Q将一包数据按l构字段Qh为控制分多次接收Q然后合qӞ通过q种手段来避免粘包?/p>
以上提到的三U措施,都有其不之处。第一U编E设|方法虽然可以避免发送方引v的粘包,但它关闭了优化算法,降低了网l发送效率,影响应用E序的性能Q一般不使用。第二种Ҏ(gu)只能减少出现_包的可能性,但ƈ不能完全避免_包Q当发送频率较高时Q或׃|络H发可能使某个时间段数据包到达接收方较快Q接收方q是有可能来不及(qing)接收Q从而导致粘包。第三种Ҏ(gu)虽然避免了粘包,但应用程序的效率较低Q对实时应用的场合不适合?/p>
相关文章截取Q?/p>
一个包没有固定长度Q以太网限制?6Q?500字节Q?500是以太|的MTUQ超q这个量QTCP?x)?f)IP数据报设|偏U量q行分片传输Q现在一般可允许应用层设|?kQNTFSp)的缓冲区Q?k的数据由底层分片Q而应用看来只是一ơ发送。windows的缓冲区l验值是4k,Socket本n分ؓ(f)两种Q流(TCP)和数据报(UDP)Q你的问题针对这两种不同使用而结Z一
栗甚臌和你是用d、还是非dSocket来编E有兟?/p>
1、通信长度Q这个是你自己决定的Q没有系l强q你要发多大的包Q实际应该根据需求和|络状况来决定。对于TCPQ这个长度可以大点,但要知道QSocket内部默认的收发缓冲区大小大概?KQ你可以用SetSockOpt来改变。但对于UDPQ就不要太大Q一般在1024?0K。注意一点,你无论发多大的包QIP层和链\层都?x)把你的包进行分片发送,一般局域网是1500左右Q广域网只有几十字节。分片后的包经q不同的路由到达接收方,对于UDP而言Q要是其中一个分片丢失,那么接收方的IP层将把整个发送包丢弃Q这Ş成丢包。显?dng)要是一个UDP发包佷大Q它被分片后Q链路层丢失分片的几率就佷大Q你q个UDP包,׃Ҏ(gu)丢失Q但是太又影响效率。最好可以配|这个|以根据不同的环境来调整到最佳状态?/p>
send()函数q回了实际发送的长度Q在|络不断的情况下Q它l不?x)返?发送失败的)错误Q最多就是返?。对于TCP你可以字节写一个@环发送。当send函数q回SOCKET_ERRORӞ才标志着有错误。但对于UDPQ你不要写@环发送,否则给你的接收带来极大的麻烦。所以UDP需要用SetSockOpt来改变Socket内部Buffer的大,以能容纳你的发包。明一点,TCP作ؓ(f),发包是不?x)整包到辄Q而是源源不断的到Q那接收方就必须l包。而UDP作ؓ(f)消息或数据报Q它一定是整包到达接收斏V?/p>
2、关于接Ӟ一般的发包都有包边界,首要的就是你q个包的长度要让接收方知道,于是有个包头信息,对于TCPQ接收方先收q个包头信息Q然后再收包数据。一ơ收齐整个包也可以,可要对结果是否收齐进行验证。这也就完成了组包过E。UDPQ那你只能整包接收了。要是你提供的接收Bufferq小QTCP返回实际接收的长度Q余下的q可以收Q而UDP不同的是Q余下的数据被丢弃ƈq回WSAEMSGSIZE错误。注意TCPQ要是你提供的Buffer佷大Q那么可能收到的是多个发包Q你必须分离它们Q还有就是当Buffer太小Q而一ơ收不完Socket内部的数据,那么Socket接收事g(OnReceive)Q可能不?x)再触发Q用事件方式进行接收时Q密切注意这炏V这些特性就是体C和数据包的区别?/p>
相关参考文章:(x)
http://www.cnblogs.com/alon/archive/2009/04/16/1437600.html
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/binghuazh/archive/2009/05/28/4222516.aspx
解决TCP|络传输“粘包”问?/p>
当前在网l传输应用中Q广泛采用的是TCP/IP通信协议?qing)其标准的socket应用开发编E接口(APIQ。TCP/IP传输层有两个q列的协议:(x)TCP和UDP。其中TCPQtransport control protocolQ传输控制协议)是面向连接的Q提供高可靠性服务。UDPQuser datagram protocolQ用h据报协议Q是无连接的Q提供高效率服务。在实际工程应用中,对可靠性和效率的选择取决于应用的环境和需求。一般情况下Q普通数据的|络传输采用高效率的udpQ重要数据的|络传输采用高可靠性的TCP?
在应用开发过E中Q笔者发现基于TCP|络传输的应用程序有时会(x)出现_包现象Q即发送方发送的若干包数据到接收Ҏ(gu)收时_成一包)。针对这U情况,我们q行了专题研I与实验。本文重点分析了TCP|络_包问题Qƈl合实验l果提出了解册问题的对{和Ҏ(gu)Q供有关工程技术h员参考?/p>
一、TCP协议?
TCP是一个面向连接的传输层协议,虽然TCP不属于iso制定的协议集Q但׃其在商业界和工业界的成功应用Q它已成Z实上的网l标准,q泛应用于各U网l主机间的通信?/p>
作ؓ(f)一个面向连接的传输层协议,TCP的目标是为用h供可靠的端到端连接,保证信息有序无误的传输。它除了提供基本的数据传输功能外Q还Z证可靠性采用了数据~号、校验和计算、数据确认等一pd措施。它对传送的每个数据字节都进行编Pq请求接收方回传认信息QackQ。发送方如果在规定的旉内没有收到数据确认,重传该数据。数据编号接收方能够处理数据的失序和重复问题。数据误码问题通过在每个传输的数据D中增加校验和予以解冻I接收方在接收到数据后(g)查校验和Q若校验和有误,则丢弃该有误码的数据D,q要求发送方重传。流量控制也是保证可靠性的一个重要措施,若无控Q可能会(x)因接收缓冲区溢出而丢失大量数据,D许多重传Q造成|络拥塞恶性@环。TCP采用可变H口q行量控制Q由接收Ҏ(gu)制发送方发送的数据量?/p>
TCP为用h供了高可靠性的|络传输服务Q但可靠性保障措施也影响了传输效率。因此,在实际工E应用中Q只有关键数据的传输才采用TCPQ而普通数据的传输一般采用高效率的udp?/p>
二、粘包问题分析与对策
TCP_包是指发送方发送的若干包数据到接收Ҏ(gu)收时_成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的?/p>
出现_包现象的原因是多方面的Q它既可能由发送方造成Q也可能由接收方造成。发送方引v的粘包是由TCP协议本n造成的,TCP为提高传输效率,发送方往往要收集到_多的数据后才发送一包数据。若q箋几次发送的数据都很,通常TCP?x)根据优化算法把q些数据合成一包后一ơ发送出去,q样接收方就收到了粘包数据。接收方引v的粘包是׃接收方用戯E不?qing)时接收数据Q从而导致粘包现象。这是因为接收方先把收到的数据放在系l接收缓冲区Q用戯E从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户q程取走Q则下一包数据放到系l接收缓冲区时就接到前一包数据之后,而用戯E根据预先设定的~冲区大从pȝ接收~冲区取数据Q这样就一ơ取C多包数据Q图1所C)?/p>
?
?
?
_包情况有两U,一U是_在一L(fng)包都是完整的数据包(?、图2所C)Q另一U情冉|_在一L(fng)包有不完整的包(?所C)Q此处假讄h收缓冲区长度为m个字节?/p>
不是所有的_包现象都需要处理,若传输的数据Z带结构的q箋数据(如文件传输)Q则不必把粘q的包分开Q简U分包)。但在实际工E应用中Q传输的数据一般ؓ(f)带结构的数据Q这时就需要做分包处理?/p>
在处理定长结构数据的_包问题Ӟ分包法比较单;在处理不定长l构数据的粘包问题时Q分包算法就比较复杂。特别是如图3所C的_包情况Q由于一包数据内容被分在了两个连l的接收包中Q处理v来难度较大。实际工E应用中应尽量避免出现粘包现象?/p>
Z避免_包现象Q可采取以下几种措施。一是对于发送方引v的粘包现象,用户可通过~程讄来避免,TCP提供了强制数据立即传送的操作指o(h)pushQTCP软g收到该操作指令后Q就立即本D|据发送出去,而不必等待发送缓冲区满;二是对于接收方引L(fng)_包Q则可通过优化E序设计、精接收q程工作量、提高接收进E优先{措施,使其?qing)时接收数据Q从而尽量避免出现粘包现象;三是由接收方控制Q将一包数据按l构字段Qh为控制分多次接收Q然后合qӞ通过q种手段来避免粘包?/p>
以上提到的三U措施,都有其不之处。第一U编E设|方法虽然可以避免发送方引v的粘包,但它关闭了优化算法,降低了网l发送效率,影响应用E序的性能Q一般不使用。第二种Ҏ(gu)只能减少出现_包的可能性,但ƈ不能完全避免_包Q当发送频率较高时Q或׃|络H发可能使某个时间段数据包到达接收方较快Q接收方q是有可能来不及(qing)接收Q从而导致粘包。第三种Ҏ(gu)虽然避免了粘包,但应用程序的效率较低Q对实时应用的场合不适合?/p>
一U比较周全的对策是:(x)接收方创Z预处理线E,Ҏ(gu)收到的数据包q行预处理,粘q的包分开。对q种Ҏ(gu)我们q行了实验,证明是高效可行的?/p>
三、编E与实现
1Q实现框?/p>
实验|络通信E序采用TCP/IP协议的socket api~程实现。socket是面向客h/服务器模型的。TCP实现框架如图4所C?/p>
?
2Q实验硬件环境:(x)
服务器:(x)pentium 350 微机
客户机:(x)pentium 166微机
|络q_Q由10兆共享式hubq接而成的局域网
3Q实验Y件环境:(x)
操作pȝQwindows 98
~程语言Qvisual c++ 5.0
4Q主要线E?/p>
~程采用多线E方式,服务器端共有两个U程Q发送数据线E、发送统计显C线E。客L(fng)共有三个U程Q接收数据线E、接攉处理_包U程、接收统计显C线E。其中,发送和接收U程优先U设为thread_priority_time_criticalQ最高优先Q,预处理线E优先为thread_priority_above_normalQ高于普通优先Q,昄U程优先Uؓ(f)thread_priority_normalQ普通优先Q?/p>
实验发送数据的数据l构如图5所C:(x)
?
5Q分包算?/p>
针对三种不同的粘包现象,分包法分别采取了相应的解决办法。其基本思\是首先将待处理的接收数据(长度设ؓ(f)mQ强行{换成预定的结构数据Ş式,q从中取出结构数据长度字D,卛_5中的nQ而后Ҏ(gu)n计算得到W一包数据长度?/p>
1)若n<mQ则表明数据包含多包数据,从其头部截取n个字节存入(f)时缓冲区Q剩余部分数据依此l@环处理,直至l束?/p>
2)若n=mQ则表明数据内Ҏ(gu)好是一完整l构数据Q直接将其存入(f)时缓冲区卛_?/p>
3)若n>mQ则表明数据内容尚不够构成一完整l构数据Q需留待与下一包数据合q后再行处理?/p>
对分包算法具体内容及(qing)软g实现有兴者,可与作者联pR?/p>
四、实验结果分?/p>
实验l果如下Q?/p>
1Q在上述实验环境下,当发送方q箋发送的若干包数据长度之和小?500bӞ怼(x)出现_包现象Q接收方l预处理U程处理后能正确解开_在一L(fng)包。若E序中设|了“发送不延迟”:(x)Qsetsockopt (socket_nameQipproto_tcpQtcp_nodelayQ?char *) &onQsizeof on) Q其中on=1Q,则不存在_包现象?/p>
2Q当发送数据ؓ(f)每包1kb?kb的不定长数据Ӟ若发送间隔时间小?0msQ偶?dng)?x)出现_包Q接收方l预处理U程处理后能正确解开_在一L(fng)包?/p>
3Qؓ(f)定处理_包的时_(d)发送方依次循环发送长度ؓ(f)1.5kb?.9kb?.2kb?.6kb?.0kb数据Q共?000包。ؓ(f)刉粘包现象,接收U程每次接收前都{待10msQ接收缓冲区设ؓ(f)5000bQ结果接收方收到526包数据,其中长度?000b的有175包。经预处理线E处理可得到1000包正数据,_包处理L间小?ms?/p>
实验l果表明QTCP_包现象实存在Q但可通过接收方的预处理予以解冻I而且处理旉非常短(实验?000包数据d处理旉不到1msQ,几乎不媄(jing)响应用程序的正常工作?/p>
先看看Windows 7中的q程桌面l我们带来了些什么新的功能:(x)
接下来,我以PDC上关于RDP的课E?/a>ZQ分以下几个部分详细的跟大家探讨一些远E桌面的技术和W(xu)indows 7中最新的q展?/p> RDP?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">RemoteDesktopProtocol的羃写,q是q程桌面的具体实现协议,微Y在MSDN上公布了RDP的协议细则,据说有差不多2000多页的文档。RDP不是微Y的专属协议,在Liunx{^C也有不少实际的应用。如果你对RDP本n感兴,可以ȝ看wikipedia中关?a target="_blank">RDPRDP协议的发展和应用历程
RDP是对|络有密集依赖的应用Q它的架构和分层如下Q?/p>
q些q来Q随着多媒体?D应用和用户体验的不断提高QW(xu)indows下的q程桌面已经不能满一些日益增多的需求。ؓ(f)此,W(xu)indows 7下的RDP和远E桌面做Z革命性的变化?/p>
在Windows 7的RDP设计中,一个非帔R要的概念是对3D囑փ囑Ş的渲染,通常Q当我们?D游戏Ӟq些渲染是在本地计算机完成的。在Windows 7的RDP中,3D渲染既可以在本地计算?我们UCؓ(f)Host?完成Q也可以在运?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">RemoteDesktop的计机(我们UCؓ(f)Client?上完成?/p>
具体的来_(d)(x)HostZ执行3D渲染ӞRDP采用了缓存、压~等技术确保Demote Desktop上图像的畅Q在q行Client机的3D渲染ӞHost机可以通过GDI, Direct 3D, Media, DWM{?D指o(h)集,把需要渲染的数据包通过RDP传送到Client计算机,由Client计算机的CPU和显卡GPU完成g的渲染计?br />
从这张架构图Q我们可以看出,在RDP协议的上层,为D2D、DX10.1、DWM、Media App、GDI App{提供了接口。用这些协议的3D游戏、高清视频播放YӞ可以数据流先通过RDP传送到RemoteDesktop所在的Client计算机,再由Client计算Z的硬件完成渲染和执行。有q样的架构,也就不难理解Qؓ(f)什么可以在q程桌面中流畅的q行3D游戏了!
大家可能比较感兴,什么样的应用是在HostZ完成渲染的,什么样的应用是在ClientZ完成渲染的,具体的Q务分工如下:(x)
Host机渲染:(x)
Client机渲染:(x)
Windows 7中RDP的另一个法宝,是对网l带宽的充分利用和压~。相比XP和Vista下的RDPQW(xu)indows 7 RDP节省了大U?0%的网l开销Q具体的试数据如下Q?/p>
我们已经比较清楚Q如果想在远E桌面流畅的玩游戏、看?sh)?jing)Q必L以下的要求Q?/p>
如果惌自己开发的应用E序支持最新的RDP协议Q需要研I一下这三个东西。我对开发的技术不是非怺解,原文照搬如下Q大家可以到MSDN里面查一下RDP的具体API?/p>
Dynamic Virtual Channels APIs
RemoteDesktop ActiveX APIs
RDP Windows Desktop Sharing APIs
开发h员可以用下面的API来检应用程序当前时候运行在q程桌面的会(x)话中Qƈ且根据情况进行优化和调整?/p>
//Managed System.Windows.Forms.SystemInformation.TerminalServerSession //Win32 GetSystemMetrics(SM_REMOTESESSION)
关于开发方面我׃深入的讨ZQ大家可以看PDC上的有关评。最后再贴几张网上找到的Windows 7q程桌面的运行效果图Q?/p>
Solaris 下的?/span> CC 。我们现在的Ҏ(gu)是先?/span> visual studio 2005 下测试通过。然后?/span> MPC Q?/span>
Make Project Creator 生成 vcproj ?/span> solaris 下的 makefile 文g。最后再对这两个工程文gq行试?/span>
MPC 是一个开源项目,采用 perl 语言~写。?/span> MPC 只需写一?/span> mpc 文g卛_非常Ҏ(gu)的生?/span> vcproj( 支持 vc6 ?vc9) 文g?/span> makefile 、语法也不复杂?/span> ACE 的工E文件就是用的这个东ѝ十分适合跨^台的目?/span>
MPC 使用
在工E根目录下创?/span> MPC/config/MPC.cfg 文gQ文件内容ؓ(f)Q?/span>
Default_type=make
Dynamic_type=$Test_root/bin/mpcfile,/home/test/MPC
Logging=info=1 warn=1
Verbose_ordering=1
W?/span> 1 行注明了生成工程文g的类型,在这里是 makefile
W?/span> 2 行引用了两个地方?/span> project 定义 ( ?/span> MPC 文g ) Q有了这一行,则工E文件中L位置?/span> mpc 文g都可以引用上面两个地?/span> ( 包含子目?/span> ) ?/span> mpc ?/span> mpb 文g了?/span>
mpc 文g是可以承的。示例如下:(x)
project(mod1):modob{
exename=”mod1?/font>
exeout=?./../bin?/font>
includes+=?./../include/mod1?/font>
Source_Files{
*.cpp
}
Header_Files{
*.h
}
}
其中 exename 为生成文件的名称Q?/span> exeout 为生成的文g的\径, includes 为头文g包含的\径?/span>
q有libout(lib文g输出路径), dllout(动态链接库输出路径), sharedname(动态链接库名称)
Mpb 文g主要是用来描qC些公q信息 ( 如公共头文gQ动态库 ) Q如Q?/span>
Project {
Includes += ../../include/common
Libpaths+=?./../lib?/font>
}
完成上面文g之后Q输入命令:(x) mwc.pl 卛_生成工程文g
注意Q在路径中切不可包含I格
mwc.pl -static 生成静态库
在MPC文g中可以加?avoids += shared
q样p避免生成动态的工程?exe或dll)
hello.mwc例子
// -*- MPC -*- workspace { hello.mpc}
hello.mpc例子
// -*- MPC -*- project(hello):aceexe, acexml, avoids_ace_for_tao { exename = hello avoids += uses_wchar Source_Files { hello.cpp}}
mwc可以看作是workspace定义Qmpc可以看作是project定义Q一个workspace可以包含多个projectQƈ且可以定义多个project之间的依赖关p,详细的语法可以参考后面提供的参考资料?
生成Makefile
$ACE_ROOT/bin/mwc.pl -type make hello.mwc
生成VC2008工程文g
$ACE_ROOT/bin/mwc.pl -type vc9 hello.mwc
同时生成多个工程文g
$ACE_ROOT/bin/mwc.pl -type make -type vc9 hello.mwc
同时生成vc9的静态和动态库工程文gQƈ且通过工程名称予以区别
$ACE_ROOT/bin/mwc.pl -type vc9 -ti lib:vc9lib -name_modifier *_lib_vc9 hello.mwc
/*++
IP Header Format 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+IP Header FormatRFC-791
--*/
typedef
struct _iphdr
{
unsigned char version:4; //版本
unsigned char ihl:4; //首部长度
unsigned char tos; //服务cd
unsigned short tot_len; //总长?
unsigned short id; //标志
unsigned short frag_off; //分片偏移
unsigned char ttl; //生存旉
unsigned char protocol; //协议
unsigned char check; //(g)验和
unsigned long saddr; //源IP地址
unsigned long daaddr; //目的IP地址
}iphdr;
/*++
UDP Header Format
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| source address |
+--------+--------+--------+--------+
| destination address |
+--------+--------+--------+--------+
| zero |protocol| UDP length |
+--------+--------+--------+--------+
UDP Header Format
RFC-768
--*/
typedef
struct _udphdr
{
unsigned short source;
unsigned short dest;
unsigned short len;
unsigned short check;}udphdr;
/*++
ICMP Header Format 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ICMP Header FormatRFC-792
--*/
typedef
struct _icmphdr
{
unsigned char type; //cd
unsigned char code; //代码
unsigned short checksum; //校验?
union
{
struct
{
unsigned short id; //标识W?
unsigned short sequence; //序号
}echo;
unsigned long gateway; //目标路由器的IP地址
struct
{
unsigned short unused; //
unsigned short mtu;
}frag;
} un;}icmphdr;
/*++
IGMP Header Format 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Group Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Access Key +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IGMP Header FormatRFC-988
--*/
typedef
struct _igmphdr
{
unsigned char type;
unsigned char code; /* For newer IGMP */
unsigned short csum;
unsigned long group;}igmphdr;
/*++
IPv6 Header Format +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ver. | IHL | TOS | Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1|1|1|1|1|0| Offset| Reserved | Source IP address part 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1|1|1|1|1|0| Offset| Reserved | Destination IP address part 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Options :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: SADDR Code |Len adr. part 2| Source IP address part 2 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: DADDR Code |Len adr. part 2| Destination IP address part 2 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: Data :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+IPv6 Header Format RFC-1365
--*/
typedef
struct _ipv6hdr
{
unsigned char version:4;
unsigned char priority:4;
unsigned char flow_lbl[3];
unsigned short payload_len;
unsigned char nexthdr;
unsigned char hop_limit;
//struct in6_addr saddr;
//struct in6_addr daddr;}ipv6hdr;
[/code]
当然Qؓ(f)了口中餐Qؓ(f)了未来脓(chung)wmmQؓ(f)了给她备房备车:(x)Q,不得不停了下来?
下面的是未整理的l构。有旉的话Q我?x)l整理,也欢q网友补充。[code]
/*
* This is an Ethernet frame header.
*/
typedef
struct _ethhdr
{
//unsigned char h_dest[ETH_ALEN]; // destination eth addr
//unsigned char h_source[ETH_ALEN]; // source ether addr
//unsigned short h_proto; // packet type ID field}ethhdr;
// FDDI
/* Define 802.2 Type 1 header */
//struct fddi_8022_1_hdr
// {
// __u8 dsap; /* destination service access point */
// __u8 ssap; /* source service access point */
// __u8 ctrl; /* control byte #1 */
// } __attribute__ ((packed));
//
///* Define 802.2 Type 2 header */
//struct fddi_8022_2_hdr
// {
// __u8 dsap; /* destination service access point */
// __u8 ssap; /* source service access point */
// __u8 ctrl_1; /* control byte #1 */
// __u8 ctrl_2; /* control byte #2 */
// } __attribute__ ((packed));
//
///* Define 802.2 SNAP header */
//#define FDDI_K_OUI_LEN 3
//struct fddi_snap_hdr
// {
// __u8 dsap; /* always 0xAA */
// __u8 ssap; /* always 0xAA */
// __u8 ctrl; /* always 0x03 */
// __u8 oui[FDDI_K_OUI_LEN]; /* organizational universal id */
// __u16 ethertype; /* packet type ID field */
// } __attribute__ ((packed));
//
///* Define FDDI LLC frame header */
//struct fddihdr
// {
// __u8 fc; /* frame control */
// __u8 daddr[FDDI_K_ALEN]; /* destination address */
// __u8 saddr[FDDI_K_ALEN]; /* source address */
// union
// {
// struct fddi_8022_1_hdr llc_8022_1;
// struct fddi_8022_2_hdr llc_8022_2;
// struct fddi_snap_hdr llc_snap;
// } hdr;
// } __attribute__ ((packed));
This edition of the SDK supports development for the following platforms:
Windows Server 2003
Windows Advanced Server, Limited Edition
Windows XP
Windows XP 64-bit Edition
Windows 2000
Windows NT versions 3.51 and 4.0
Windows Millennium Edition
Windows 95 and Windows 98
XPSP2 August 2004 EditionQ可以在VC6使用Q开发针对XPSP2的特D功能的E序Q可以和上面的一道用,但请安装在不同目录?a >http://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm
Newly released: The Platform SDK for Windows XP Service Pack 2 support
(includes MDAC 2.8, Tablet 1.7 and Windows Installer 3.0)
The XPSP2 version of the Platform SDK was developed to work either side by
side with the Windows Server 2003 SDK or standalone but will not provide
build environments for:
Windows Server 2003
Windows Advanced Server, Limited Edition
Windows XP
Windows XP 64-bit Edition
Windows 2000
Windows NT versions 3.51 and 4.0
Windows Millennium Edition
Windows 95 and Windows 98
You must install The Microsoft Platform Software Development Kit (SDK) for
Windows Server 2003 for those environments.The SDKs can not be installed in
the same directory for side by side performance.
Windows Server 2003 SP1 Platform SDK Web InstallQ最新版的SDKQ可惜不能和VC6一起协作,不再支持NT4?X?a >http://www.microsoft.com/downloads/details.aspx?familyid=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en
This edition of the SDK replaces the previous SDKs for Windows XP SP2 and Windows Server 2003 and can be used to develop applications for those platforms.
Supported Operating Systems: Windows 2000; Windows Server 2003; Windows XP 64-bit; Windows XP Professional Edition ; Windows XP Service Pack 1
This SDK does not support working with Microsoft Visual C/C 6.0 as support for VC 6.0 has ended. The last SDK that will work with VC 6.0 is the February 2003 Edition.
vc6?0岁了Q呵呵,蛮经典的东西?
以下SDK和库都是能在VC6下用。它们之间各自有各自的功能,不需要比较,除非是相同类型的库,例如XML解析器,我才比较一下,排名也不分先后,q且描述的简略不代表个h的感情色情。很多库我都喜欢Q但我只是简单说两句。例如MFCQSTLQICE{等。希望大家的开发效率能提高不少。有些库或者SDK没有|列其中Q大家可以补上?
Windows server 2003 r2 SDK(最新的Windows SDK是Vista版的)
提供最新操作系l的API接口Q支持Windows2003r2以及(qing)以前的系l,如果想用一些^台特性,q开发包是必备的?
http://www.microsoft.com/downloads/info.aspx?na=22&p=22&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=&u=%2fdownloads%2fdetails.aspx%3fFamilyID%3de15438ac-60be-41bd-aa14-7f1e0f19ca0d%26DisplayLang%3den
SDK属于Visual C++的一部分,但其自带的版本较?已经不适合一些品了,例如WinXP{?该SDK包含以下MS产品的SDK:
Windows,Office,Windows Script(q个应该是个品吧..WScript/CScript),netmeeting,IIS, Internet Explorer,MS XML,GDI+,Windows Media Services,DirectShow...
包含以下的程序库:ATL,MFC,OpenGL...
更多信息h看SDK或者MSDN自带的帮助目?
netmeeting SDK
惛_q程桌面,多h?x)?视频,文g传??sh)子白板功能嵌入C的程序或者网站中?用它?yu)没错?
内含在Windows server 2003 r2 SDK
Internet Explorer SDK
可以用它来解析网,从而开发出自己特别的需求的“新览器”,也可以扩展IE。遨游,TT{外x览器属于这cd用。QZONE也属于,新版本的QZONE是采用自动化的方式去扩展?
内含在Windows SDK里?
WMEncoderSDK
Windows Media~码器的开发包Q可以从影像捕捉讑֤或桌面画面录Ӟ亦提供文件格式{换的功能?
------------
是一套容易用,而且功能强大的YӞ提供使用者自行录制媄(jing)像的功能Q可以从影像捕捉讑֤或桌面画面录Ӟ亦提供文件格式{换的功能。主要的特色在于Ҏ(gu)使用、高品质~码、增强的可程序化与管理,特点为:(x)新的使用者界面和向导Q更Ҏ(gu)讑֮与制作媄(jing)片,用来提供|络现场播放或需求播放,q支持多重来源,可以立即切换来源Qƈ可监视编码程序进行时的资料,如媄(jing)像大、资料流量等{。新的编码能力,支持de-interlacing、inverse telecine和屏q捕捉,能有更好的输出品质,能从320*240*60fps?40*480*30fpsQ捕捉文件最大可?0GBQ支持的捕捉讑֤包括Winnov、ATI、HauppaugeQ以?qing)USB视讯摄媄(jing)机等。Windows Media Encoder SDK提供|站开发者全自动的编码控Ӟ可从|络QLANQ远端控Ӟ或透过API存取或ASP控制
----------------
http://www.microsoft.com/downloads/details.aspx?familyid=5691BA02-E496-465A-BBA9-B2F1182CDF24&displaylang=en
WMPlayerSDK
为Windows Media Player开发插件或者调用其lg的开发包?
http://www.microsoft.com/downloads/details.aspx?FamilyID=e43cbe59-678a-458a-86a7-ff1716fad02f&DisplayLang=en
detours
Microsoft自己出的一个PE镜像操作包,可以L实现API Hook,修改IAT{?
http://research.microsoft.com/research/downloads/Details/10E5D78C-592C-419D-A53E-BAE8DBD81801/Details.aspx
WTL(Windows Template Library)
一个基于模板技术、简z而又完整的界面库Q能生成y的应用程序,厌倦了庞大的MFCQ可以考虑使用它来开发界面,除了对界面提供支持,q提供了一pd的辅助类Q例如:(x)CString,CFindFile{?.0支持WinCEQ以?qing)Vista的特性?
http://www.microsoft.com/downloads/details.aspx?FamilyID=e5ba5ba4-6e6b-462a-b24c-61115e846f0c&DisplayLang=en
DirectX SDK
能出色地完成高速的实时动画渲染、交互式音乐与环境音效、高效多媒体数据处理{Q务。Windows下游戏开发一般用它?
http://www.microsoft.com/downloads/details.aspx?familyid=4b78a58a-e672-4b83-a28e-72b5e93bd60a&displaylang=en
DDK/IFS DDK(Windows Driver Development Kit)
用于开发Windows驱动E序的开发包,装了它VC也能开发驱动程序,不过推荐使用DDK带的build工具q行~译。IFS DDK可以开发文件系l驱动?
http://www.microsoft.com/whdc/devtools/ddk/default.mspx
MS CHART
可以在程序里面画Z业的q图,曲线囄专业的统计图形?
内含在VB或者office的安装包里?
ATL
用于开发COM的一个框Ӟ有了它,写C(j)OMp村־多了。除了对COM的支持,q提供了CImage(GDI+的包装类Q很好用)、CRegKey(注册表的支持)、CAtlRegExp(正则表达?{?
VC自带或者包含在Windows SDK?
GDI+ SDK
GDI+是Microsoft的新的图形编E接?h单、易用等Ҏ(gu)。支持多U图象格式,不必再ؓ(f)jpg,gif{格式解码而发愁。对比GDIQ有以下新特性,支持渐变d、对立的路径对象、矩阵对象、多U图片格式等。WinXP以及(qing)以上pȝ自带Gdi+所需的DLL?
包含在新版Visual Studio或者包含在Windows SDK?
CxImage
一套图象操作代?支持多种格式:包括bmp,jpg,png,gif(静态和动态都支持),wbmp,tif,wmf,pcx,tga,ico{?ZGDI的操作而不是GDI+.q提供了一pd的算?例如~放,旋{,灰度{等.
http://www.xdp.it
MFC
一个非常?比VC6q?而且优秀的程序框Ӟ是对Windows API源码U的装Q有不少的优U软g是用它写的?
包含在Visual Studio?
Xtreme ToolkitPro/BCGControlBar Professional
非常优秀MFC扩展?用于界面开?它们提供了仿Office,Visual Studio{MS产品外观的控?
Xtreme有免费版本CJLibrary http://www.codejock.com/
BCG在VS2008里是MFC的一部分?http://www.bcgsoft.com/
WFC(Win32 Foundation Classes)
一个MFC扩展?装了那些MFC没有装的Win32 API..例如:CDesktop,CMixer,CRegistry{等
http://www.codeproject.com/library/wfc.asp
Microsoft Speech SDK
文本朗读和语韌别的开发包。也支持中文发音?
http://www.microsoft.com/speech
http://www.microsoft.com/downloads/details.aspx?FamilyID=5e86ec97-40a7-453f-b0ee-6583171b4530&DisplayLang=en
MS Agent
WinXP搜烦里的那只黄色狗或者Office2003里面的助手就是MS AgentQ用q个开发包可以控制他们?
包含在Visual Studio或者包含在Windows SDK?
MS XML/tinyXML
用于解析XML文g的开发包?
MS XML功能强大,对中文有完美的支?
tinyXML体积?带源代码.
(其它XML解析器都不怎么?IBM的XML4C功能虽强,可是它的DLL?2M那么?Xerces c++不能支持中文,Libxml要支持中文的话需要自己写转换函数)
MS XML:http://www.microsoft.com/downloads/details.aspx?FamilyID=993c0bcf-3bcf-4009-be21-27e85e1857b1&DisplayLang=en
tinyXML:www.sourceforge.net/projects/tinyxml
OpenGL
是个专业?DE序接口Q是一个功能强大,调用方便的底?D囑Ş库。OpenGL是个与硬件无关的软g接口Q可以在不同的^台工作?
包含在Visual Studio或者包含在Windows SDK?
STL
非常优秀的C++标准?提供数据容器以及(qing)通用法{的C++?
包含在Visual Studio
Boost
一套开放源代码、高度可UL的C++?提供数D、泛型编E、元~程、^台API{支持。常用的有RegexQLambdaQsmart_ptr{等
http://www.boost.org
WinPcap
最常用的就是用它来捕获|络包。很多网l程序,以前用过的一个电(sh)信的拨号器,Ethereal{都是用这个?
http://winpcap.polito.it
zLib
一个开源的数据无损压羃?最方便的是它可以压~内存缓?而且速度?很多|络游戏都用了它压~数据包.
http://www.gzip.org/zlib/
Xvid/Divx
视频~码/解码?(Divx是个商业产品,Xvid是个开源项?
www.xvid.org
ACE/ICE
ACE全称adaptive communication enviromentQ是一套C++的通信库。它提供了socket/threading/memory management{多U系l调用的面对对象的wrapper,使C++通信软g开发更加简单?
ICE(Internet Communications Engine)一U现代的面向对象中间Ӟ可用于替代像CORBA或COM/DCOM/COM+q样的中间gQ特Ҏ(gu)开发简易,q行效率高。可以开发出?sh)信U别的应用?
ACE:http://www.cs.wustl.edu/~schmidt/ACE.html
ICE:http://www.zeroc.com/
crypto++
实现了各U公开密钥法、对U加密算法、数字签名算法、信息摘要算法以?qing)其相关的其它密码算法等{?其实我只用里面的md5,crc32和aes.
http://sourceforge.net/projects/cryptopp
WxWindows (跨^台的GUI?
cdơ极像MFC,通过多年的开发也是一个日完善的GUI?完全开放源代码的?
http://www.wxwindows.org/
blitz (高效率的数D函数库)
Blitz++ 是一个高效率的数D函数库Q它的设计目的是希望建立一套既具像C++ 一h便,同时又比Fortran速度更快的数D环境?
http://folk.uio.no/patricg/blitz/html/index.html