当前位置: 首页 > >

IOCP完全开发经验总结(三):开发UDP的IOCP

发布时间:

UDP和TCP不同,后者面向连接的,而前者并不需要连接,所以去掉了一个很重要的数据结构:SocketContext,代码也比TCP的简单很多,经过实际测试,也有一些坑需要跳一下,这里会一一说明。


1、UDP和TCP区别

深入过协议的人应该很清楚,但我们只需要知道,TCP是面向连接的,基于数据流,会确保接收方收到的数据的顺序和正确性;而UDP是网络报文,报文是一个一个的发送,接收方收到的数据可能是乱序或丢失的(但收到的肯定是正确的,因为IP层会进行校验,如果错误直接丢掉)。
优缺点也很明显,大体上说就是TCP消耗的资源比较多,使用起来稍微麻烦些(因为还有很多其他的功能),但不用咱来保证数据的一致性和流量控制等。UDP轻量、快速,使用简单,但根据需要可能要由咱来编写数据包的重组、重发等。
根据特性,TCP适用于文本传输、文件传输、数据传输等不能有差错的地方,而UDP适用于实时视频聊天、语音聊天这种对数据一致性不是特别高的地方(缺一帧多一帧都无所谓那种)。


2、UDP报文长度

虽说协议中对UDP报文长度没什么要求,但实际使用时为了降低报文丢失率,我们尽可能让报文长度缩短,因为发送时IP层会对数据包进行拆分,收到时会进行重组,如果报文太大,IP层拆分的数据包如果有一个出错,就会把整个报文都丢掉了。
所以,如果是局域网传输,UDP报文尽量设置为2500-8-20=2472字节,如果是Internet传输,尽量设置为576-8-20=548字节内。


3、IOContext结构体

因为UDP不会建立连接,所以TCP中的SocketContext结构体就用不到了,所以IOContext结构体就至关重要了,这里需要修改一下,我们的IOContext还得保存报文的IP和Port。
同时去掉的还有AcceptIOContext,我们直接投递RecvIOContext就能收到数据,不需要投递AcceptIOContext。


4、发送和接收

这部分我就不详细说了,把TCP的WSASend和WSARecv换成WSASendTo和WSARecvFrom即可,比TCP多了两个参数:用来接收的IP和Port(这两个再IOContext结构体内定义过了)。
Send也没那么复杂了,直接调用WSASendTo投递即可,不用关心什么多线程、发送乱序,反正都一样,哈哈~


5、初始化

WSASocket(AF_INET, SOCK_DGRAM,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
把流换成报文。


6、其他

因为没有Socket,所以只需要投递一定量的RecvIOContext,关闭时回收;SendIOContext返回时,用完数据回收即可。


就这么多,注意一下就行,比TCP简单的多的多。



友情链接: