2012-05-02 10 views
1

Androidが処理されているかどうか、またはネイティブコードに問題があるかどうか、またはその両方がわかりません。android ndkソケットネットワークに到達できない

私は(SWIGによって生成されたラッパー)C++でのUDPソケットを設定しています:

udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
     if (udpSocket < 0) 
     { 
      pthread_mutex_unlock(&csOpenCloseUdp); 
      throw IOException("Failed to open socket"); 
     } 


     char bAllowMultiple = true; 
     setsockopt(udpSocket, SOL_SOCKET, SO_REUSEADDR, &bAllowMultiple, sizeof(bAllowMultiple)); 
     setsockopt(udpSocket, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&hopLimit, sizeof(hopLimit)); 
     setsockopt(udpSocket, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localAddr, sizeof(localAddr)); 

     // Set to non-blocking mode 
     unsigned long bMode = 1; 
     ioctl(udpSocket, FIONBIO, &bMode); 

     // Create the local endpoint 
     sockaddr_in localEndPoint; 
     localEndPoint.sin_family = AF_INET; 
     localEndPoint.sin_addr.s_addr = localAddr.s_addr; 
     localEndPoint.sin_port = groupEndPoint.sin_port; 

     // Bind the socket to the port 
     int r = bind(udpSocket, (sockaddr*)&localEndPoint, sizeof(localEndPoint)); 
     if (r == SOCKET_ERROR) 
     { 
      //LeaveCriticalSection(&csOpenCloseUdp); 
      pthread_mutex_unlock(&csOpenCloseUdp); 
      close(); 
      throw IOException("Failed to bind port"); 
     } 


     // Join the multicast group 
     struct ip_mreq imr; 
     imr.imr_multiaddr = groupEndPoint.sin_addr; 
     imr.imr_interface.s_addr = localAddr.s_addr; 
     setsockopt(udpSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&imr, sizeof(imr)); 

ソケットが例外をスローされていない、そしてこの後、それは一部値ではありませんINVALID_SOCKETを持っています。

私もパケットを送信しようとすると、

int r = sendto(udpSocket, (char*)dataToSend, (size_t)length, 0, (sockaddr*)&groupEndPoint, (socklen_t)sizeof(groupEndPoint)); 

が、私はエラー番号101を取得する:ネットワークが到達不能です。

私はソケットプログラミングには新しく、Androidのソケットは始めるには悪い方法だと知っていますが、実際にはこれを行い、少し時間があります。ネットワークに到達できない可能性がある理由を知っている人は誰ですか?誰かがAndroid上でUDPを使って遊んだり、光を放つことができますか?

+0

この理由は、コードではなくネットワーク設定である可能性があります。自分のプライベートWi-Fiネットワークに接続している場合は、ルータの設定を確認する必要があります。 –

+0

私はアームdevデバイスボード上の物理LANを使用しています。私は、デバイスからそれが話しているデバイスへの直接の専用のリンクを持っています。誰もがこの種のものを試してみたら、助けてもらえるでしょう – eskimo9

+0

他のシステムにadbコマンドラインからpingできますか? –

答えて

0

が解決しよう:私はちょうどそれが私のラップトップに話を取得するには、デバイス上のイーサネット設定と猿に持っていた

。なんらかの理由で専用のリンクを使用するのが好きではなかったので、私はローカルネットワークルータを経由しています。今は別の問題が発生していますが、これが完了しました

1

C++ソケットを使用する要件はありますか?可能であれば、時間の利益のために、すべての利益のためにかなり多く 、私は代わりにJava APIをお勧めしたいと思います。使用方法の例を次に示します:http://android-er.blogspot.com/2011/01/simple-communication-using.html。私はCが好きですが、ここでは使用しないことをお勧めします。

+0

アドバイス、しかし、C++はそこにあります、私はデバイスドライバライブラリを与えられ、それを変換するように言われました。私は時間やノウハウのJavaでライブラリを書き換える必要はありませんが、私は持っているC + +は、現在ANSIと互換性があります、私の問題は、アンドロイドがLinuxベースのネットワークドライバにアクセスする方法が表示されますが、 – eskimo9

+0

もしそれが役に立つなら、それはおそらくAndroidがどのようにLinuxベースのネットワークドライバにアクセスするかではありません。私はAndroidが他のLinuxディストリビューションと一貫していることを発見しました。とにかく、あなたのコード、またはそれのコマンドラインバージョンは別のディストリビューションで動作しますか? –

関連する問題