Android NDK套接字连接问题

时间:2012-07-16 04:35:19

标签: android c++ linux sockets android-ndk

好的,所以我可以使用以下代码在我的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;
}

错误是111 ERCONNREFUSED ...请。任何帮助,将不胜感激。该应用程序在权限中设置了完整的Internet访问....任何想法?

我的Linux版本使用相同的代码编译时遇到了同样的问题......

1 个答案:

答案 0 :(得分:5)

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