Skip to content

getPortsAndAddresses 函数详解 ​

📍 script.js 取 socket 的源/目的地址和端口。

📎 源码在线查看:script.js#L219-L253(getPortsAndAddresses)

做什么 ​

给一个 fd(或 Socket 实例),返回 {src_addr, src_port, dst_addr, dst_port} 填入 message。

实现路径 ​

Native 路径(fd) ​

javascript
var SSL_get_fd = new NativeFunction(p, 'int', ['pointer']);
var fd = SSL_get_fd(ssl);
// 用 fd 查 socket 地址(getsockname/getpeername 或 Java Socket)

Java 路径(Socket 实例) ​

javascript
var localAddr = socket.getLocalSocketAddress();
var peerAddr = socket.getRemoteSocketAddress();
// 解析 InetSocketAddress

地址解析 ​

javascript
var ip = addr.getAddress().getHostAddress();
if (ip.indexOf(":") !== -1) {
    // IPv4-mapped IPv6: ::ffff:1.2.3.4
    ip = ip.split(":").pop();
}
var num = ipToNumber(ip);
var bigEndian = ntohl(num);

端口 ​

javascript
message[src_dst + "_port"] = sockAddr.port & 0xFFFF;

端口取低 16 位。

失败情况 ​

情况结果
SSL_get_fd 返回 0fd 无效,地址为 0
socket 已关闭getLocalSocketAddress 返回 null
IPv6 纯地址当前只处理 IPv4,可能异常

地址为 0 时 pcap 里显示 0.0.0.0,见 zero-address。

相关文档 ​

基于 VitePress 构建 · 教学用途