1

サーバーが受け入れたのと同じ接続を使用してクライアントがデータを送信するのは正しい方法ですか?

状況はこのようなものです。私の PC で実行されているブルートゥース サーバーがあり、反対側にはクライアントとサーバーを備えた Android フォンがあります。Android側から、クライアントは接続を開始します。私はアンドロイドサンプルからブルートゥースチャットの例を使用しています。

そして、Androidのサーバークライアントは次のようになります

     BluetoothSocket socket;
     InputStream tmpIn = null;
     OutputStream tmpOut = null;

    // Get the BluetoothSocket input and output streams

        tmpIn = socket.getInputStream();
        tmpOut = socket.getOutputStream(); 

PC 側では、Bluezライブラリを使用してサーバーとクライアントを実装しています。
コードには、ブルートゥースの受信スレッドとメイン スレッドが含まれています。サーバーが Android フォンからの接続を受け入れるときはいつでも、ソケット値をグローバル変数に割り当てるだけで、クライアントが同じソケットを使用して送信するデータを送信する必要があるときはいつでも、

サーバ:-

int GLOBAL_CLIENT;
void* recive_bluetooth_trd(void*)
{
...............................
..............................
 client = accept(s, (struct sockaddr *)&rem_addr, &opt);
 GLOBAL_CLIENT=client;

 while(1){
    bytes_read = read(client, buf, sizeof(buf));
....................
...................
}

クライアント:-

void clinet(char *msg, int length){
........................

 int bytes_write=write(GLOBAL_CLIENT,message, length);

..........................
}

私の質問は、それは正しい方法ですか? 問題は、クライアントが PC からデータを正常に送信しても、Android 側で受信できない場合があることです。

4

2 に答える 2

0

while(1)私が見る最大の問題は、クライアントが切断された場合でも、ループを離れないことです。Read は、ソケットが切断されたことを通知しようとして、0 バイトの読み取り (<= 0 の戻りコードを確認) ですぐに永遠に戻ります。コードはタイトな無限ループに陥り、シングルスレッドで処理できるすべての CPU リソースを使い果たします。

常にソケットと IO のリターン コードを確認し、エラーを正しく処理する必要があります。ソケットのエラー処理は通常、実際のソケット コードの約 3 倍です。

..........もちろん、それが重要な部分でない限り。人々が尋ねている質問に関連するコードをいつ隠しているかを判断するのは常に困難です。

于 2013-08-24T06:32:37.333 に答える