2

次のコードを使用して、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;
}

次に、次のコードを使用して同じプロセスで接続できます。

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 です... お願いします。任意の助けをいただければ幸いです。アプリケーションには、アクセス許可で設定された完全なインターネット アクセスがあります。

同じコードでコンパイルされた Linux ビルドにも同じ問題があります...

4

1 に答える 1

5

INADDR_ANY に接続しようとしています。hostent の関連部分を addr.sin_addr.s_addr にコピーします。

于 2012-07-17T04:06:59.923 に答える