前两天代码调通了,socks通讯协议都问题了,但连接建立好开始转包时候,无论是客户端还是浏览器都不能正确识别返回的http包。各种gdb跟踪,抓包和代码走读(主要review socks处理逻辑代码)都没发现问题,抓包倒是发现有个异常的ack包,tcp传输层后会带几个00。但是ack包又不是我的程序发的,整体都处于纠结状,尝试各种的方法,都没效。最后实在没办法,自己用python快速写了个socks5的客户端,一个包一个包的来对。没想到正是这个方法找到了问题所在。在用python的struct.unpack来解socks server返回的协议包时,发现一个应该是10字节的包长度竟然是12.打开组包的代码,愕然发现定义socks协议的struct时候忘记加上pack(1)使得一个字节对齐。顿时汗汗汗。。。
由于socks的request返回包前面正好是4个字节,而地址是ip4时候也是4字节,后面2字节储存端口,对齐的两个字节用00补上。刚好不响应客户端程序解包,但是python的struct.unpack()却需要指定的长度,抛出异常,最终暴露了问题。
遇到问题习惯按照自己设想问题可能出现的地方去找,明显是不够,对自己确认不会出现问题的地方,也要去重新确认。