2012-05-04 11 views
0

私はソケットプログラムを作成して1台の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 pthread_join(m_thread2) 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. 

2つのスレッドを使用して、画面に読み込んで送信する際に、より小さなバージョンを作成しました。

コード:

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

using namespace std; 

const int RCVBUFSIZE=2000; 
char echoString[RCVBUFSIZE]; 
int recvMsgSize; 
static void * _sendExec(void *instance); 
static void * _recvExec(void *instance); 
int main(){ 
    pthread_t m_thread, m_thread2; 
    int merror, merror2; 
    merror=pthread_create(&m_thread, NULL, _sendExec, NULL); 
    merror2=pthread_create(&m_thread2, NULL, _recvExec, NULL); 
    pthread_join(m_thread2, NULL); 
} 
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); 
    } 
} 
static void * _recvExec(void *instance){ 
    while(1){ 
    //recvMsgSize=msgTmp->recv(buffer, RCVBUFSIZE) 
    write(fileno(stdout), "", 0); 
    sleep(1); 
    } 
} 

あなたがcat file.tar.gz | ./a.out | tar -zvtをしようとした場合、あなたがいないすべてのデータが画面上に示されていることがわかります、私はメインの上に置けば、pthread_joinをにその[OK]を削除し、問題は私が必要ですデータが戻って時間がかかることがあります。 cat file.tar.gz | ssh [email protected] "tar -zvt"と同じです。 問題がある、私はちょうど後sendExecを殺すことができるrecvExecを使用して戻ってすべてのデータを受信し、それだけでただ

おかげで、問題を説明するために、ソケット部をコード変更 後に私に標準入力をフラッシュし、削除しましたあなたはファイル終了指示を提供することはありませんので、あなたの例では、人々

+0

同じvarに書き込まないので、起こりません。 – Lefsler

+0

これらはこのコードで行います。実際のコードではないコードを投稿しないでください。混乱するだけです。 – nos

+0

申し訳ありませんが、echoString内の1つの書き込みと別の書き込みがバッファ内にあります。今のところイライラしている場合にのみ、XD。 – Lefsler

答えて

1

tarは、複数の入力を待っています。このお試しください:fclose修正あなたのサンプルプログラムを追加する際

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); 
    fclose(stdout); // THIS IS THE LINE THAT FIXES THE SAMPLE PROGRAM 
    pthread_exit(0); 
    } 
} 

を、私は必ずしもあなたのメインプログラムでそれをお勧めしません。サンプルにはまだ無限ループ(_recvExec)があり、決して終了しません。

+0

この場合の無限ループは単なる例ですが、私はデータを送信するためにソケットを使用していると書いてありますが、ソケットを閉じる方法があるか、ポインタを削除する必要がありますか? – Lefsler

+0

私はトラフソケットを送り、もう片方ではパイプ/フォークを使ってデータをプログラムに送ります。 – Lefsler

関連する問題