小米6调用C++建立Socket监听,本地回环连接超时

发布于 2022-09-07 20:46:16 字数 1935 浏览 56 评论 0

问题描述

所用框架是Cocos2d-x,语言是C++。
因需求,项目需要在C++层做一套网络层接管管理游戏相关的收发数据。于是写了在本地写了一个监听socket,游戏端通过本地回环地址连接,然后对数据进行处理后转发至目标服务器。win32,ios以及android部分机型均可通过运行。问题在以小米6、oppo,vivo,一加的部分机型上,在对本地回环的TCP连接上超时,同一局域网内的PC上telnet手机的IP和端口也连不通。

问题出现的环境背景及自己尝试过哪些方法

此问题在小米6上是必现的,在程序开始是就有做socket的监听,通过nenstat命令可以看到确实有监听成功。

clipboard.png

然后PC上对手机的局域网IP ping都是可以通的。但是telnet连不上绑定的端口号,大约十秒后显示连接失败。

clipboard.png

clipboard.png

clipboard.png

同时,在游戏中对127.0.0.1的13025端口connect也连接不上,一直处于SYN_SENT状态直到超时。

clipboard.png

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

// socket绑定及监听
struct sockaddr_in svraddr;
svraddr.sin_family = AF_INET;
svraddr.sin_addr.s_addr = htonl(INADDR_ANY);
svraddr.sin_port = htons(port);

int opt = 1;
if (setsockopt(m_sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&opt, sizeof(opt)) < 0)
{
    Log("bind error1! error:%d", opt);
    return false;
}

int on = 1;
if (setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof(on)) < 0)
{
    Log("bind error2! error:%d", on);
    return false;
}

int ret = ::bind(m_sock, (struct sockaddr*)&svraddr, sizeof(svraddr));
if (ret == SOCKET_ERROR) {
    Log("bind error3!");
    int error = -1;
    int len = sizeof(int);
    getsockopt(m_sock, SOL_SOCKET, SO_ERROR, (char*)&error, (socklen_t *)&len);
    Log("error = %d", error);
    return false;
}

ret = listen(m_sock, backlog);
if (ret == SOCKET_ERROR) {
    Log("listen error!");
    return false;
}
return true;

初步怀疑可能是被小米的防火墙限制了,但是找不出证据和解决方案。。。
望各位技术大佬指教一下

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挽容 2022-09-14 20:46:16

有可能是防火墙(iptables)规则阻挡了,也有可能是 SELinux 策略阻挡了。不论哪种,估计很难在用户手机上改变它的规则。

若你要监听的 socket 只对本机应用开放,建议改用非匿名的 unix socket 作跨进程通信。

参考 http://man7.org/linux/man-pag...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文