socat命令

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

socat命令
场景
有时我们开发了⼀个api接⼝,⾃⼰调得好好的,接⼝⽂档也写好了,但别⼈调⽤时就是有问题,⽽当我们调试时,发现请求根本没进来或进来了却取不到调⽤参数,该怎么告知对⽅调⽤姿势哪不对呢?
解决⽅法
对于编码新⼿,⼀般会和对⽅撕扯⼀会,然后甚⾄去review对⽅的代码,这样也许能解决问题,但⾃⼰毕竟不熟悉别⼈系统的实现,耗费时间较长。

另外api调⽤端可能因为封装⽅式不同或者加过⼀些拦截器,导致你看调⽤端的代码根本看不到什么问题,或者因为调⽤参数有⼀些不易分辨或不可见的特殊字符,让你⽆法察觉到这⾥有问题。

其实这种问题,我们从⽹络层出发,对⽐⾃⼰正确调⽤时的数据包与对⽅错误调⽤时的数据包内容,以此来诊断问题所在更加⾼效,毕竟任何封装或拦截器的处理,最终都会反馈在底层的交互数据上。

这⾥,我使⽤springmvc开发⼀个简单的接⼝,如下:
@RestController
public class TestController {
@RequestMapping(value = "/test",produces = MimeTypeUtils.TEXT_PLAIN_VALUE)
@ResponseBody
public String test(@RequestParam(name = "name") String name){
return name;
}
}
复制代码
这个接⼝就是直接将name参数的值返回了,然后我使⽤curl模拟正确与错误的调⽤⽅式,如下:
正确调⽤⽅式
错误调⽤⽅式
使⽤socat中转请求
$ socat -v TCP4-LISTEN:8080,bind=0.0.0.0,reuseaddr,fork TCP4:localhost:8081
调⽤端访问socat监听的8080端⼝
正确调⽤⽅式
错误调⽤⽅式
其中socat添加-v参数后,会⾃动将中转的数据流以明⽂显⽰出来,其中类似> 2020/10/11 13:05:03.536294 length=162 from=0 to=161之后的部分,就是请求数据,⽽类似< 2020/10/11 13:05:03.740585 length=116 from=0 to=115之后的部分,就是响应数据,同样的,你可以将两次请求数据复制到⽂本对⽐⼯具中去发现差异。

有时这种调⽤差异是特殊字符导致的,⽐如空⽩字符、零宽字符,上⾯的⽅式可能看不出差异,这时你可以将-v参数替换为-x参数,来对⽐数据的⼗六进制,同样的wireshark也可以查看数据包的⼗六进制,相信你摸索⼀下也可以找到。

相关文档
最新文档