c多線程上傳文件
Ⅰ VC如何實現多線程文件傳輸
發送端,將文件分成N份(如5),FILE1(0-a位元組),FILE2(a-b位元組),FILE3(b-c位元組),FILE4(c-d位元組),FILE5(d-文件長度)。 發送可以使用M個線程(如5),THREAD1負責發送FILE1,依次類推,發送的每個數據包包括如下內容:文件內容的長度,文件內容,文件內容起始點相對於整個文件的位置,文件內容相對於整個文件的位置。例如:文件A的總長度為100000位元組,則可以先發送一個數據包給接收端,讓其准備接收,接著發送 4000(長度),....(內容的二進制流),0(起始),4000(結束)。 接收端根據接收的包寫文件即可。 http://www.vckbase.com/document/viewdoc/?id=448 看一下吧
Ⅱ windows下採用tcp協議的c語言多線程文件傳輸問題!!
多收幾次嘛,直到收完為止
Ⅲ windows環境,多線程情況下,C語言向文件寫入數據。
下面的程序,編譯之後,你可以運行很多個實例,目前我將文件寫在了D:\1.txt,每個程序寫1000行數據,這些值你可以自己更改(比如 寫在C:,每個程序寫10000行等),等程序都寫完後,你可以去文件中查看寫文件的結果。補充一下,我是在VC6.0環境中寫的,所以windows.h,如果你不是在這個環境中的話,可能需要修改一些定義,比如DWORD等。其他的API都是windows平台提供的API;
#include <stdio.h>
#include "windows.h"
int main()
{
//獲取進程ID,因為你希望是多個進程運行同時寫一個文件,所以,我們列印出進程ID
DWORD dwProcessID = GetCurrentProcessId();
//初始化我們要寫入文件中的內容,及該內容長度;
char szContent[100] = {0};
sprintf(szContent,"process[%u] write file\r\n",dwProcessID);
DWORD dwContentLen = strlen(szContent);
//創建互斥量,這樣可以進行進程間的互斥,當然用這個也可以做線程間的互斥
HANDLE hMutex = CreateMutex(NULL,FALSE,"MyFileMutex");
if (NULL == hMutex)
{
printf("[%u]Create/Open Mutex error!\r\n",dwProcessID);
return 1;
}
//創建或打開文件
HANDLE hFile = CreateFile("D:\\1.txt",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_ARCHIVE,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
printf("[%u]Creat/Open file error!\r\n",dwProcessID);
return 1;
}
//循環寫入文件
for(int i = 0; i < 1000 ; i++)
{
//等待臨界資源,即鎖定文件
WaitForSingleObject(hMutex,INFINITE);
printf("Process[%u] Get the signal\r\n",dwProcessID);
DWORD len = 0;
//因為是共享寫文件,即多個程序寫一個文件,所以一定要將文件指針偏移到尾部
SetFilePointer(hFile,0,NULL,FILE_END);
//寫入文件
BOOL rnt = WriteFile(hFile,szContent,dwContentLen,&len,NULL);
if (rnt == FALSE)
{
printf("Process[%u] Fail to write file\r\n",dwProcessID);
}
//釋放互斥量,解除鎖定
ReleaseMutex(hMutex);
//加個Sleep便於我們中間觀察結果
Sleep(30);
}
CloseHandle(hMutex);
CloseHandle(hFile);
return 0;
}
應你要求,我把AIP中的宏定義解釋如下:
HANDLE hFile = CreateFile("D:\\1.txt",
GENERIC_READ | GENERIC_WRITE,//表示程序對該文件有讀和寫的許可權
FILE_SHARE_WRITE | FILE_SHARE_READ,//表示可以多個程序共享讀和寫的許可權
NULL,
OPEN_ALWAYS,//表示打開該文件,如果該文件不存在,則創建該文件
FILE_ATTRIBUTE_ARCHIVE,//文件的屬性為存檔
NULL);
WaitForSingleObject(hMutex,INFINITE);
//INFINITE表示永遠等待,直到hMutex有信號為止
SetFilePointer(hFile,0,NULL,FILE_END);
//FILE_END表示從文件尾部開始偏移;實際此舉就是將文件指針偏移到文件尾部;
Ⅳ c語言文件讀寫 多線程
主線程讀的是A文件,次線程寫的是B文件,兩者不沖突。4K的buffer已經算很小了。重點是主次線程共享的數據需要做同步,所以才造成了要等待的現象。你說的類似消費者和生產者模型。
Ⅳ 編寫了兩個.c文件,其中一個用到了多線程,makefile文件怎麼寫,怎麼加
兩個c文件是要變成同一個可執行程序的話
那麼ldflags加上-lpthread就可以了。
因為ld是在將兩個.o合成可執行文件用的。
如果是分別編成兩個可執行文件,建議寫兩個makefile
使用不同的ld選項。
Ⅵ 用C語言如何同時傳輸N個文件
既然單個的都沒問題了,多個也就好辦了
想傳多個就在你的程序里加個循環,循環里添加傳輸的代碼
想同時傳的話就得多線程了,把你的傳單個的代碼寫成一個線程函數,同時起多個線程都高用這個函數就行了
Ⅶ 多線程上傳,多線程下載,多線程抓取頁面,會不會丟失文件 壓縮/解壓造成文件錯誤....
丟文件、壓縮、解壓縮錯誤,穩定,跟多線程都沒有本質的關系,它本身只是讓程序並行運行的手段而已。
為什麼多線程總給人不穩定的感覺呢,其實是因為多線程程序比較難控制,說句行話就是多線程同步不容易做好。
傳統的單線程程序執行是順序執行的,其執行的流程、結果是可以預知的,所以代碼相對來說比較容易寫,但是多線程的執行順序是無序的,比如 你順序啟動 A,B,C線程,但是有可能 C先完成,然後再到A,B(OR B,A),這樣,你的後續程序就很難寫了。
所以,多線程程序學習的關鍵就在線程同步控制上,這個工作做好了,多線程程序就會穩定,且有更高的效率。
既然是linux下遠程傳輸文件內容,文件數據量較大,而且要保證傳輸質量的話,自然是選擇TCP來傳輸。
推薦API自然是socket,至於例子,http://memorymyann.javaeye.com/admin/blogs/619855
這只是一個很簡單的例子,多進程並發TCP傳輸需要注意很多問題,不過,在程序運行後會慢慢凸顯出來,慢慢改就是。