lony225
  • 0
  • 新人请关照

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

问题描述

所用框架是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;

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

阅读 854
评论 更新于 2018-08-11
    1 个回答
    李毅
    • 4.4k

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

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

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

    评论 赞赏 2018-08-11
      撰写回答

      登录后参与交流、获取后续更新提醒