0

あるPCから別のPCにデータを転送するためのソケットプログラムを作成していますが、処理するバイナリデータを反対側に送信すると問題が発生します。この場合、データソケットがデータを送信している間、メッセージソケットをリッスンするために1つのスレッドが必要です。そのため、問題はソケットではないことがわかりました。画面にデータを書き込もうとすると問題が発生します(今回はソケットがありません)。だから私はfflush(stdout)を使ってデータをフラッシュしようとしましたが、運がありませんでした。コードはこのように機能します。

Initialize the 2 sockets.
Initialize 2 threads.
  One to get the data back through the data socket.
  The other send the data.    
And while sending all the data one while(true){sleep(1)} in the main function, because the data can take 1 second to be processed or one hour so i keep the program alive this way (Don't know if that is the better way).

読み取りと画面への送信に1つのスレッドだけを使用して、メインでしばらくの間、小さいバージョンを作成しました。

コード:

#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

const int RCVBUFSIZE=2000;
char echoString[RCVBUFSIZE];

static void * _sendExec(void *instance);

int main(){
  pthread_t m_thread;
  int merror;
  merror=pthread_create(&m_thread, NULL, _sendExec, NULL);
  while(1){sleep(1);}
}
static void * _sendExec(void *instance){
  int size;
  for(;;){
    while((size=read(fileno(stdin), echoString, RCVBUFSIZE))>0) write(fileno(stdout), echoString, size);
    fflush(stdin);
    fflush(stdout);
    pthread_exit(0);
  }
}

catfile.tar.gzを試してみてください| ./a.out | tar -zvt画面にすべてのデータが表示されているわけではないことがわかります。メインに置いて、スリープを解除しても問題ありません。問題は、データを戻す必要があり、時間がかかる可能性があることです。猫のfile.tar.gzを実行するのと同じです。ssh root @server"tar-zvt"。

人々に感謝します

4

1 に答える 1

1

提供したコードは、使用している実際のコードではないと思います。wreckgar23で述べたように、スレッドが終了するのを待ちたい場合は、メイン関数の最後でpthread_joinを使用する必要があります。while(1){sleep(1);} / pthread_exit(0)を削除すると、pthread_joinによってメインがスレッドの終了を待機します。

また、while(1)/ for(;;)を使用することはあまり良い考えではありません。少なくともint値を使用して0に設定し、値が1に変更されるまですべてのデータ処理を実行できます。終了コマンドのソケットを介して受信するデータ内の特定の「メッセージ」で、intの値を1に設定します(したがって、(クライアント)入力を介してサーバーの存続期間を制御でき、サーバーアプリケーション全体を停止できますデータの処理が終了した後。)そうする場合は、セキュリティへの影響も考慮する必要があります。

また、使用しているソケットの種類を明示的に指定する必要があります。たとえば、udpソケットを使用していて、バッファが小さい場合、データが失われる可能性があります。また、バッファからデータを出力して書き込むことはできません。同時に。(画面にバッファを書き込むには時間がかかります。画面にデータを書き込むときに、新しいデータがバッファに到着し、印刷する前に古いデータを上書きする可能性があります)

于 2012-04-28T00:15:16.940 に答える