网上telnet的资料多入牛毛,我不再重复。分享一下用lwip协议栈调试telnet的经历,希望对大家有帮助。
环境是lwip协议栈来实现telnet的Server,PC为Client
自己碰到的几个问题。
1. 回显。即在client输入一个字符,会显示两个字符。
2. 显示反应缓慢。在client端每个字符都需要等待一小段时间后再输入,否则不能完整的被识别。
3. 对于Server发回比较长的数据,无法全部显示。
解决方法
问题1:
思路:第一个问题比较简单。回显的原因是自己在Client输入了一个字符,Server收到了该字符后,又回送给了Client端再次显示了出来,就变成显示两次了。
方法:在telnet中有协商选项,就是用来商定一些通信细节的。可以找到有 “IAC DON’T Echo”(255 254 1) 表示“禁止回送”,那么只要在通信的过程中,将该选项协商好即可。
思路:反应慢,无非就是接收慢,或者发送慢,或者都慢。通过wireshark抓包后发现,Server接收没有问题,每个字符都能正常被接收到;若发送的频率高,则会丢字符。那么就是发送的原因了,对发送函数做做手脚应该就ok了。
telnet是用tcp来发送,我也用了tcp_write()这个函数来发送,为什么还发送不出去呢?其实tcp不是你想发,想发就能发的,它有几种发送限制。其中有一种是到了限定的时间才会发送。
方法:将tcp_fasttmr();在每次调用完tcp_write()后调用,保证字符能够顺利的发出去。
问题3:
思路:数据太长无法显示,就是某个配置分配的太少了,分配多点就好了嘛。可是为什么会这样呢?由于tcp是可靠传输,发送出去的报文是要等待回应的,如果不回应,报文不会删除,等待着某时刻再次发送,得等到了回应才会把该tcp报文删除,否则就不会释放内存。比如说我server回复”ip addr 192.168.7.180”,由于之前设定的是一个字符就发送一次,发送完这句话则需要发送21条报文;又由于设备硬件比较低端,是单线程,根本没有到处理tcp的回应函数那里,就已经达到了tcp的报文条数上限,之后的字符就再也发不出去了。
方法:设置一个大点的缓冲区,将想要发送的内容存在这个缓冲区中。发送的条件有两条,时间大于0.1s或者缓冲区的长度大于512个字节(根据实际来控制),这样就能顺利发送大数据了。
PS:也有可能是tcp的数据段buf限制了大小,有很多地方都会限制,得都修改了才有效果。
转载于:https://blog.51cto.com/zhangchixiang/1173100