我正在創建一個套接字程序以將數據從一臺PC傳輸到另一臺,但當我發送一些二進制數據以處理另一端時,我遇到問題。 在這種情況下,我需要一個線程來偵聽消息套接字,而數據套接字發送數據。 所以我發現問題不是套接字,如果我嘗試只寫數據到屏幕(這次沒有套接字),問題就會發生。 所以我試圖刷新數據使用fflush(標準輸出),沒有運氣。 這些代碼以這種方式工作。線程不刷新數據,在屏幕上顯示數據時出錯
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).
我創建了一個較小的版本,只使用一個線程讀取併發送到屏幕上,並在主要的時間。
代碼:
#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);
}
}
如果你試圖貓file.tar.gz | ./a.out | tar -zvt你可以看到,並非所有的數據都顯示在屏幕上,如果我把主要的,刪除睡眠它確定,問題是我需要的數據回來,它可能需要時間。 這就像我做一個貓file.tar.gz | ssh root @ server「tar -zvt」。
感謝的人
睡眠將阻止整個過程。您可以使用條件變量 - 查找pthread_cond_timedwait的示例。我不知道爲什麼你會失去一些意見,但可能與此有關。在你的例子中,你可以加入線程,但我想這是你形成一個簡單例子的結果。用pthread_testcancel()替換它,看看你是否得到相同的行爲 – wreckgar23 2012-04-27 14:27:25
不錯,所以這是不正確的使用一段時間來保持線程活着,我想這是XD的錯誤。 – Lefsler 2012-04-27 14:35:16
如果您只想確保您的主要部分在線程完成之前未完成,請使用pthread_join加入該線程 – wreckgar23 2012-04-27 14:37:42