【发布时间】:2012-07-16 04:35:18
【问题描述】:
好的,所以我可以使用以下代码在我的 Android 应用中创建一个监听套接字:
bool CSocket::tcplisten(int port, int max, int mode)
{
if((sockid = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) return false;
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(port);
if(mode)setsync(1);
if(bind(sockid, (struct sockaddr*)&addr, sizeof(sockaddr)) == SOCKET_ERROR)
{
closesocket(sockid);
return false;
}
if(listen(sockid, max) == SOCKET_ERROR)
{
closesocket(sockid);
return false;
}
return true;
}
然后我可以使用以下代码在 SAME 进程中连接到它:
bool CSocket::tcpconnect(char *address, int port, int mode)
{
sockaddr_in addr;
hostent* hostEntry;
if((sockid = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR)
return false;
if((hostEntry = gethostbyname(address)) == NULL)
{
closesocket(sockid);
return false;
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons((u_short)port);
if(mode ==2)setsync(1);
if(connect(sockid, (struct sockaddr*)&addr, sizeof(sockaddr)) == SOCKET_ERROR)
{
closesocket(sockid);
return false;
}
if(mode ==1)setsync(1);
return true;
}
问题是,我无法连接到运行侦听套接字的其他机器或 google.com 等远程机器上。任何想法为什么我不能让它工作?
经过一番调整和探索,发现错误出现在这一行:
if(connect(sockid, (struct sockaddr*)&addr, sizeof(sockaddr)) == SOCKET_ERROR)
{
closesocket(sockid);
return false;
}
errno 是 111 ERCONNREFUSED... 请。任何帮助,将不胜感激。该应用程序在权限中设置了完整的 Internet 访问权限......有什么想法吗?
我的 Linux 版本使用相同的代码编译时遇到了同样的问题...
【问题讨论】:
-
我立即想到的是,在
bind调用中,你使用sizeof(sockaddr),而它应该是sizeof(sockaddr_in)。在这里没关系,因为它们通常大小相同,但如果您开始使用 IPv6,则会有所不同。 -
好的,今晚我会发布错误代码。我会包括它,但我不知道它....
-
所以,errno 是 111 ERCONNREFUSED。经过一些代码调整和东西,我发现错误发生在以下行: if(connect(sockid, (struct sockaddr*)&addr, sizeof(sockaddr)) == SOCKET_ERROR) { closesocket(sockid);返回假; } 的 tcpconnect 方法。大家有什么想法吗?
-
请分享您包含的标题。我找不到
<net/net.h>
标签: android c++ linux sockets android-ndk