我在使用Android NDK的C ++代码中使用一些套接字时遇到问题。创建两个套接字,一个从另一个读取。这适用于 Android上的网络连接,带有和没有另一台计算机上的网络连接,但不在没有网络连接的Android上。
在套接字关闭之前,这是 netstat 输出。感兴趣的是
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 - filled = 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。当没有网络连接时,为什么无法读取localhost上的任何字节?
答案 0 :(得分:0)
原来这是由另一个问题引起的。将IP地址解析为char数组后的一段时间,在数组上调用了delete []。当没有网络连接时,指针被直接重新分配给127.0.0.1,因此程序在delete []上崩溃。使用
将IP复制到阵列中strcpy(ip, "127.0.0.1");
表示指针仍然指向数组,并且在调用delete []时程序不会崩溃。