Android NDK - 使用本地主机时的套接字关闭
Android NDK - socket closing when using localhost
我在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[] 时不会崩溃。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- 如何确定网络堆栈何时准备好再次打开到同一主机/端口的套接字?
- 本地主机在套接字编程以及一般应用中需要什么
- Android NDK - 使用本地主机时的套接字关闭
- 通过套接字一致地丢失数据(但在使用本地主机连接时不会)
- 通过Linux套接字接收多个主机的数据
- 从服务器端C++套接字主机名
- 在本地主机套接字上是否需要任何类型的保持连接