2012-01-13 14 views
0

私はプログラムを作成してリモートのデータを処理しています。 だから私は何かのように使用execlpはソケットを使用してデータを送信しません

catファイル| ./client -i "machineip" -p "port" -c "command

私のtarファイルの中でリストを取得したい場合は、コマンドを" base64 -d | tar -zvt "として使用できます。 私はこれらのオブジェクトを持っています。

ソック..は、Cソケットを実装するオブジェクトです。 = 2000 RCVBUFSIZEと私は私が私がパイプやフォークを使っていることを行うには子供や親プロセス

てるかどうかを知るために、データに PIDを送信し、取得するために使用サイズ。 基本的な構造は次のとおりです。

int fd[2]; 
pipe(fd); 
if((pid=fork()) == -1) exit(-1); 
if(pid == 0) 
{ 
while((recvMsgSize = sock->recv(echoBuffer, RCVBUFSIZE)){ 
    write(fd[1], echoBuffer, recvMsgSize); 
} 
} 
else pipeback(fd,sock) 

だから私は、データを取得し、親から子へ送信することができます。 クライアントは、標準入力から読み込み、ソケットを介して送信し、サーバは問題がpipeBack

void pipeback(int *fdRef, TCPSocket *sock){ 
char *buffer = new char[2000]; 
int size; 
close(fdRef[1]); 
dup2(fdRef[0], 0); 
close(fdrEf[0]); 
pipe(fout) 
if((pid = fork()) == -1)exit(-1); 
if(pid ==0){ 
    close(fout[0]); 
    dup2(fout[1], 1); 
    close(fout[1]); 
    execlp("bash", "bash", "-c", "base64", NULL); 
} 
else{ 
    close(fout[1]); 
    while((size = read(fout[0], buffer, 2000)) > 0){ 
    sock->send(buffer, size); 
    write(fileno(stdout), buffer, size); 
    } 
} 
} 

問題である

がラインであるソケットを介して読み込む「のexeclp(」bashの「」bashの"、" -c "、" base64 "、NULL);"私が4番目の引数に猫を使用する場合、それは動作します。もし私が1つ使用すれば - lahtrは私にフォルダ上のファイルを表示するので、魅力的です。 しかし、私がbase64またはuuencodeを使用すると...おそらく他のコマンドは、読み込み行で停止し、停止し、die、straceとgdbを使って何が起こっているのかを確認します。 このプロセスをデバッグするために必要なことはわかりません。 私は別のプログラムを作成しました。これはstdinから読み込み、パイプを使ってbashを使ってbase64またはuuencodeで処理します。 それは動作します、私はそれはソケットや時間と何かですが、私は考えを持っていません。 申し訳ありませんが、私の英語はそのようなものではありません... XD。すべて

NOTEため ありがとう:

私はstraceのを使用して、私はpidが停止し、それは(既に停止)PIDから読み取ろうとBASE64を使用するとき、私は気づきました。

誰かが私がそれをどのように解決できるか知っていますか?

答えて

0

問題がありました

私はデータを送信し、同じコードブロックでrecvしようとしました。 だから私は今私はいくつかのデータがあるまで待つために選択を使用しています。

関連する問題