端口冲突时,会出现bind fail异常,这时可以用ss --vsock -pl命令dump出所有listen状态的vsock,但实际发现传入的9000端口,dump出来却是10275,如下图:
难道是内核把端口改了?分析内核态源码,ss最终获取的vsock信息通过内核态vsock_dia_dump函数得到,该函数dump了vsock_dump_table(这是个数组链表),vsock_bind函数最终会把vsock信息保存到其中,期间并没有修改port。
分析用户态代码:
发现它修改了port,板子是小端,调用htons后,port变为大端,即9000(0x2328)被修改为0x2823(也就是10275)