2

Android NDK で C++ コードの一部のソケットを使用すると問題が発生します。2 つのソケットが作成され、一方が他方から読み取ります。これは、別のマシンのネットワーク接続の有無にかかわらず、 Android のネットワーク接続で機能しますが、ネットワーク接続のない Android では機能しません

ソケットが閉じる前の netstat 出力を次に示します気になるラインは

tcp        0      0 127.0.0.1:32993        127.0.0.1:46810        ESTABLISHED

Proto Recv-Q Send-Q Local Address          Foreign Address        State
tcp        0      0 0.0.0.0:32993          0.0.0.0:*              LISTEN
tcp        0      0 0.0.0.0:45549          0.0.0.0:*              LISTEN
tcp        0      0 127.0.0.1:5037         0.0.0.0:*              LISTEN
tcp        0      0 0.0.0.0:5555           0.0.0.0:*              LISTEN
tcp        0      0 127.0.0.1:46811        127.0.0.1:32993        ESTABLISHED
tcp        0      0 127.0.0.1:32993        127.0.0.1:46811        ESTABLISHED
tcp        0      0 127.0.0.1:46810        127.0.0.1:32993        ESTABLISHED
tcp        0      0 127.0.0.1:32993        127.0.0.1:46810        ESTABLISHED
tcp        0      0 10.0.2.15:5555         10.0.2.2:34217         ESTABLISHED
udp        0      0 10.0.2.15:49667        10.0.2.3:53           
udp        0      0 0.0.0.0:60262          0.0.0.0:*      

次に、ソケット 127.0.0.1:46810 (header_length - Filled = 10) から 10 バイトを読み取ろうとします。

bytes = read(fd, header, header_length - filled);

ただし、0 バイトが読み込まれます。TCP_NODELAY がソケットに設定されています。これは、読み取り後のnetstat出力です。

Proto Recv-Q Send-Q Local Address          Foreign Address        State
tcp        0      0 0.0.0.0:32993          0.0.0.0:*              LISTEN
tcp        0      0 127.0.0.1:5037         0.0.0.0:*              LISTEN
tcp        0      0 0.0.0.0:5555           0.0.0.0:*              LISTEN
tcp        0      0 127.0.0.1:46811        127.0.0.1:32993        FIN_WAIT2
tcp        0      1 127.0.0.1:32993        127.0.0.1:46811        CLOSE_WAIT
tcp        0      0 127.0.0.1:46810        127.0.0.1:32993        FIN_WAIT2
tcp        0      0 127.0.0.1:32993        127.0.0.1:46810        CLOSE_WAIT
tcp        0      0 10.0.2.15:5555         10.0.2.2:34217         ESTABLISHED
udp        0      0 0.0.0.0:60262          0.0.0.0:*        

ネットワーク接続があれば問題はなく、使用されるアドレスは 127.0.0.1 のままです。ネットワーク接続がない場合、localhost でバイトの読み取りに失敗するのはなぜですか?

4

1 に答える 1

0

これは別の問題によって引き起こされていたことが判明しました。IP アドレスを char 配列に解決した後、配列に対して delete[] が呼び出されていました。ネットワーク接続がない場合、ポインターは 127.0.0.1 に直接再割り当てされていたため、プログラムは削除 [] でクラッシュしていました。を使用して IP をアレイにコピーする

strcpy(ip, "127.0.0.1");

つまり、ポインターは引き続き配列を指しており、delete[] を呼び出してもプログラムはクラッシュしません。

于 2012-12-09T19:59:37.910 に答える