-
-
[原创]自己写的TFTP服务端,使用完成端口模型,呵呵,大牛飘过~~
-
发表于:
2010-11-16 20:08
8388
-
[原创]自己写的TFTP服务端,使用完成端口模型,呵呵,大牛飘过~~
最近学习了完成端口编程模型,即IOCP,看了书上写的TCP服务端,就想写个TFTP服务端练练手,一方面因为TFTP是比较简单的协议,另一方面对完成端口的熟悉.
完成端口:
完成端口基本上公认为一种在windows服务平台上比较成熟和高效的IO方法,用完成端口进行重叠I/O的技术在WindowsNT和WIndows2000上提供了真正的可扩展性。完成端口和Windows Socket2.0结合可以开发出支持大量连接的网络服务程序。使用起来还是很简单的,调用CreateIoCompletionPort既可以创建完成端口也可以将套接字与完成端口对象相关联,然后所有在完成端口上关联的套接字上读和写的操作的完成都反应到了完成端口上TFTP:TFTP类似FTP,不过它比FTP简单的多了,也少了安全的认证,适用于小型文件的传输,关于它的详细信息可以百度搜索下对应的RFC文件说明,附件中也有.| Opcode | Filename | 0 | Mode | 0 |
这是个简单的TFTP报文结构,Mode字段是模式,我的服务端只支持2进制模式,这也是普遍的格式。程序的基本思想是创建1个监听线程和N个工作线程,监听线程负责启动工作线程,和处理超时重发机制,最后结束工作线程。工作线程负责从完成端口取出数据 ,并根据读和写操作的完成来具体做些处理。对于每个客户端则创建一个套接字并申请一个CIOCPContext来描述它,对于发送和接收每个数据包 用一个CIOCPBuffer来描述 ,具体定义见代码
几个感觉有点难度的方面:1.在判断一个数据包是属于哪个CIOCPContext的时候,起初是在CIOCPBuffer中加入了对应的Context指针,但后来发现这样的逻辑是有问题的,比如你在客户端的socket1,和socket2上都投递了读请求,这时候向socket2发送的数据来了,但这时候完成端口它是分不清的,可能的结果是它满足了socket1的读请求,这就导致了context指针不正确,所以我是这样解决
//read操作完成后的Context是不正确的需要修正 memcpy(&addrFrom ,(pBuffer->buff+516) ,sizeof(SOCKADDR));
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!