Android NDK - 使用本地主机时的套接字关闭

Android NDK - socket closing when using localhost

本文关键字:套接字 主机 NDK Android      更新时间:2023-10-16

我在Android NDK的C++代码中使用某些套接字时遇到问题。创建两个套接字,一个套接字从另一个套接字读取。这适用于 Android 上的网络连接,包括另一台计算机上的网络连接和没有网络连接,但不适用于没有网络连接的 Android。

这是套接字关闭前的网络统计输出。兴趣线是

tcp        0      0 127.0.0.1:32993        127.0.0.1:46810        ESTABLISHED
Proto Recv-Q Send-Q Local Address          Foreign Address        State
tcp        0      0 0.0.0.0:32993          0.0.0.0:*              LISTEN
tcp        0      0 0.0.0.0:45549          0.0.0.0:*              LISTEN
tcp        0      0 127.0.0.1:5037         0.0.0.0:*              LISTEN
tcp        0      0 0.0.0.0:5555           0.0.0.0:*              LISTEN
tcp        0      0 127.0.0.1:46811        127.0.0.1:32993        ESTABLISHED
tcp        0      0 127.0.0.1:32993        127.0.0.1:46811        ESTABLISHED
tcp        0      0 127.0.0.1:46810        127.0.0.1:32993        ESTABLISHED
tcp        0      0 127.0.0.1:32993        127.0.0.1:46810        ESTABLISHED
tcp        0      0 10.0.2.15:5555         10.0.2.2:34217         ESTABLISHED
udp        0      0 10.0.2.15:49667        10.0.2.3:53           
udp        0      0 0.0.0.0:60262          0.0.0.0:*      

然后我尝试从套接字 127.0.0.1:46810 读取 10 个字节(header_length - 填充 = 10):

bytes = read(fd, header, header_length - filled);

但是,读取 0 个字节。TCP_NODELAY已在插槽上设置。这是读取后的 netstat 输出。

Proto Recv-Q Send-Q Local Address          Foreign Address        State
tcp        0      0 0.0.0.0:32993          0.0.0.0:*              LISTEN
tcp        0      0 127.0.0.1:5037         0.0.0.0:*              LISTEN
tcp        0      0 0.0.0.0:5555           0.0.0.0:*              LISTEN
tcp        0      0 127.0.0.1:46811        127.0.0.1:32993        FIN_WAIT2
tcp        0      1 127.0.0.1:32993        127.0.0.1:46811        CLOSE_WAIT
tcp        0      0 127.0.0.1:46810        127.0.0.1:32993        FIN_WAIT2
tcp        0      0 127.0.0.1:32993        127.0.0.1:46810        CLOSE_WAIT
tcp        0      0 10.0.2.15:5555         10.0.2.2:34217         ESTABLISHED
udp        0      0 0.0.0.0:60262          0.0.0.0:*        

有网络连接时没有问题,使用的地址仍然是127.0.0.1。为什么在没有网络连接的情况下无法读取本地主机上的任何字节?

事实证明,这是由另一个问题引起的。在将 IP 地址解析为 char 数组一段时间后,正在阵列上调用 delete[]。当没有网络连接时,指针被直接重新分配给 127.0.0.1,因此程序在 delete[] 时崩溃。使用 将 IP 复制到阵列中

strcpy(ip, "127.0.0.1");

表示指针仍然指向数组,并且程序在调用 delete[] 时不会崩溃。