私はソケットプログラムを作成して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を使用して戻ってすべてのデータを受信し、それだけでただ
おかげで、問題を説明するために、ソケット部をコード変更 後に私に標準入力をフラッシュし、削除しましたあなたはファイル終了指示を提供することはありませんので、あなたの例では、人々
同じvarに書き込まないので、起こりません。 – Lefsler
これらはこのコードで行います。実際のコードではないコードを投稿しないでください。混乱するだけです。 – nos
申し訳ありませんが、echoString内の1つの書き込みと別の書き込みがバッファ内にあります。今のところイライラしている場合にのみ、XD。 – Lefsler