我一直在研究文件下載應用程序,其中服務器連續等待來自客戶端的新連接請求,當新連接到達時服務器接受此連接並創建一個新進程以服務最近連接到服務器的客戶端。客戶端可以請求從服務器下載多個文件。對於每個文件,客戶端和服務器端創建一個新線程,並且每個文件的數據傳輸應在服務器和客戶端的適當線程對之間執行。我使用C和pthread爲線程。現在,我有穩定的套接字連接和成功創建每個客戶端的過程。客戶端 - 服務器應用程序中的線程同步?
對於線程文件transer,我曾嘗試如下:
在客戶端我創建它運行到接收文件的方法線程:
int k;
for (k = 0; k < fNameCounter; k++)
{
pthread_t thread_id;
int status = pthread_create(&thread_id, NULL, &receiveFile, fName);
if (status != 0)
{
printf("Thread Creation Failed \n");
exit(0);
}
}
同樣,在服務器端,我創建相同線程數如下:
int k;
for (k = 0; k < fnameCounter; k++)
{
pthread_t thread_id;
int status = pthread_create(&thread_id, NULL, &sendFile, fName);
if (status != 0)
{
printf("Thread Creation Failed \n");
exit(0);
}
}
SENDFILE和receiveFile功能簡單的寫入和讀取由FNAME指定的文件的字節(你可以在看在pthread_create )的插座,在這一點上我有一個大問題:
在這個程序中,只要我想,可能有問題,文件的內容可能是從服務器的所有線程完成接收數據後不同,因爲SENDFILE因爲readFile函數只是從套接字讀取並寫入套接字。
我怎麼能保證,客戶的每個線程服務器的正確的線程得到正確的數據,如我解釋如下:
receive send
cthread1 ----> a.txt <----- sthread1
cthread1 ----> a.txt <----- sthread1
cthread1 ----> a.txt <----- sthread1
附:我知道在一個套接字上創建多個線程並不合理,但是,這是我的工作,我需要這樣做:/。
問候。
實際上,這是一個課程項目,因此我需要這樣做。此外,我知道使用線程是毫無意義的,因爲我將爲每個客戶端提供一個套接字,但我沒有選擇:)並且真的陷入了同步問題。 – StM 2012-03-12 13:26:34
請編輯您的問題以使您的約束更加清晰:使用單個套接字和兩側的多個線程並行發送多個文件。提及這是一項任務,而且這種條件無論如何效率都不可談判。 – 2012-03-12 13:31:40