2012-04-27 60 views
0

我正在創建一個套接字程序以將數據從一臺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」。

感謝的人

+0

睡眠將阻止整個過程。您可以使用條件變量 - 查找pthread_cond_timedwait的示例。我不知道爲什麼你會失去一些意見,但可能與此有關。在你的例子中,你可以加入線程,但我想這是你形成一個簡單例子的結果。用pthread_testcancel()替換它,看看你是否得到相同的行爲 – wreckgar23 2012-04-27 14:27:25

+0

不錯,所以這是不正確的使用一段時間來保持線程活着,我想這是XD的錯誤。 – Lefsler 2012-04-27 14:35:16

+1

如果您只想確保您的主要部分在線程完成之前未完成,請使用pthread_join加入該線程 – wreckgar23 2012-04-27 14:37:42

回答

1

我asume您所提供的代碼是不是你正在使用的實際代碼.. 作爲wreckgar23提到的,你應該在主函數結束時,如果你想等待線程使用pthread_join函數完。您可以刪除while(1){sleep(1);}/pthread_exit(0),pthread_join將使線程完成的主要等待。

同時使用while(1)/ for(;;)並不是一個好主意..你至少可以使用一個int值將它設置爲0,並執行所有數據處理,直到它將其值更改爲1。可以檢查通過套接字接收的終止命令的數據中的某個「消息」,並將int的值設置爲1.(因此,您可以通過您的(客戶端)輸入控制服務器的生命週期,服務器應用程序在處理完數據後可能會停止。)如果這樣做,則還應考慮安全隱患。

您還應該明確指定您正在使用的插座類型。 例如如果你使用udp套接字並且你有一個小緩衝區,你可能會丟失數據。 另外,您不能從緩衝區中打印數據並同時寫入數據。 (將緩衝區寫入屏幕需要一些時間。在將數據寫入屏幕時,可能會有新數據到達緩衝區並在有機會打印之前覆蓋舊數據)

相關問題