【问题标题】:Android NDK socket connectivity issuesAndroid NDK 套接字连接问题
【发布时间】: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,则会有所不同。
  • 您需要添加代码以获取实际错误,例如connect 失败时。这是通过在调用失败时检查变量errno 来完成的。您还可以使用perror 打印相应的错误消息,或使用strerror 自定义打印的消息。检查实际错误并编辑您的问题,这样回答您的问题会非常容易。
  • 好的,今晚我会发布错误代码。我会包括它,但我不知道它....
  • 所以,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


【解决方案1】:

您正在尝试连接到 INADDR_ANY。您想将hostent的相关部分复制到addr.sin_addr.s_addr中。

【讨论】:

猜你喜欢
  • 2016-04-22
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多