在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java  C++  Android  Linux  網(wǎng)絡(luò)安全  HTML/ 小米6調(diào)用C++建立Socket監(jiān)聽,本地回環(huán)連接超時(shí)

小米6調(diào)用C++建立Socket監(jiān)聽,本地回環(huán)連接超時(shí)

問(wèn)題描述

所用框架是Cocos2d-x,語(yǔ)言是C++。
因需求,項(xiàng)目需要在C++層做一套網(wǎng)絡(luò)層接管管理游戲相關(guān)的收發(fā)數(shù)據(jù)。于是寫了在本地寫了一個(gè)監(jiān)聽socket,游戲端通過(guò)本地回環(huán)地址連接,然后對(duì)數(shù)據(jù)進(jìn)行處理后轉(zhuǎn)發(fā)至目標(biāo)服務(wù)器。win32,ios以及android部分機(jī)型均可通過(guò)運(yùn)行。問(wèn)題在以小米6、oppo,vivo,一加的部分機(jī)型上,在對(duì)本地回環(huán)的TCP連接上超時(shí),同一局域網(wǎng)內(nèi)的PC上telnet手機(jī)的IP和端口也連不通。

問(wèn)題出現(xiàn)的環(huán)境背景及自己嘗試過(guò)哪些方法

此問(wèn)題在小米6上是必現(xiàn)的,在程序開始是就有做socket的監(jiān)聽,通過(guò)nenstat命令可以看到確實(shí)有監(jiān)聽成功。

clipboard.png

然后PC上對(duì)手機(jī)的局域網(wǎng)IP ping都是可以通的。但是telnet連不上綁定的端口號(hào),大約十秒后顯示連接失敗。

clipboard.png

clipboard.png

clipboard.png

同時(shí),在游戲中對(duì)127.0.0.1的13025端口connect也連接不上,一直處于SYN_SENT狀態(tài)直到超時(shí)。

clipboard.png

相關(guān)代碼

// 請(qǐng)把代碼文本粘貼到下方(請(qǐng)勿用圖片代替代碼)

// socket綁定及監(jiān)聽
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;

初步懷疑可能是被小米的防火墻限制了,但是找不出證據(jù)和解決方案。。。
望各位技術(shù)大佬指教一下

回答
編輯回答
任她鬧

有可能是防火墻(iptables)規(guī)則阻擋了,也有可能是 SELinux 策略阻擋了。不論哪種,估計(jì)很難在用戶手機(jī)上改變它的規(guī)則。

若你要監(jiān)聽的 socket 只對(duì)本機(jī)應(yīng)用開放,建議改用非匿名的 unix socket 作跨進(jìn)程通信。

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

2017年6月11日 18:08