資源簡介
基于linux下的c/c++程序,多線程,斷點續傳功能沒有實現, 可傳輸大于2G的文件。
設計思想:預先分配的N個緩沖區形成類似循環隊列。
【1】預先分配N個緩沖區,多線程方式對緩沖區進行讀寫互斥,有類似生產者消費者的思想。
【2】服務器兩個線程,一個線程負責讀文件進入緩沖區,另一個線程負責發送文件數據。
【3】客戶端兩個線程,一個線程負責接收文件進入緩沖區,另一個線程負責寫文件數據。
【4】服務器端,命令行./Server_NBuffer 要傳輸的文件名
【5】客戶端,命令行./Client_NBuffer 服務器地址

代碼片段和文件信息
#define?_GNU_SOURCE
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?????//?for?sockaddr_in
#include?????//?for?socket
#include?????//?for?socket
#include?????????//?for?printf
#include?????????//?for?exit
#include?????????//?for?bzero
#include
#include??
#include?
#define?SERVER_PORT????6666
#define?LENGTH_OF_LISTEN_QUEUE??20
#define?FILE_NAME_MAX_SIZE?512
#define?SPLIT_FILE_NAME_SIZE?100
#define?BUFFMAX?1024
#define?BUFFNUM???5
#define?N?20
char?*pBuff[3]={NULL};
sem_t?mutex[3]fullavail;
struct?fileMSG
{
char?fileName[SPLIT_FILE_NAME_SIZE];
long?long?fileSize;
};
struct?BreakPointMsg
{
long?long?iStart;
long?long?iReadSize;
};
struct?FileThd
{
char?fileName[SPLIT_FILE_NAME_SIZE];
int?serverSocket;
long?long?recvSize;
int?fd;
long?long?istart;
};
int?InitOn();
int?ConnectServer(int?argcchar?**argv);
int?SendBreakpMSG2Server(int?serverSocket?struct?fileMSG?fm[]);
int?CreateRecvFile(char?fileName[]?long?long?fileSize);
void?RecvFileThread(void?*arg);
void?WriteFileThread(void?*arg);
int?ProcessMain(int?server_socketchar?filename[]);
int?main(int?argcchar?**argv)
{
char?file_name[SPLIT_FILE_NAME_SIZE]=““;
bzero(file_nameSPLIT_FILE_NAME_SIZE);
if?(!InitOn())
{
printf(“初始化出錯!“);
return?1;
}
int?sSocket?=?ConnectServer(argcargv);
if?(sSocket?==?-1)
{
printf(“\n不能連接服務器!“);
return?1;
}
struct?timeval?tpstarttpend;?//用于記錄時間?
float?timeuse;?//所用時間
gettimeofday(&tpstartNULL);?
printf(“\n開始計算時間...“);
????struct?fileMSG?fm[1];
????if?(SendBreakpMSG2Server(sSocket?fm)?==?0)
????{
???????printf(“\n發送斷點信息到服務器有誤!“);
????}
printf(“\n服務器發來的文件名為:%s要讀的文件大小為%lld“fm->fileNamefm->fileSize);?
????if?(CreateRecvFile(fm->fileNamefm->fileSize)?==?0)
????{
????????printf(“創建接收文件失敗!“);
????}
????if?(ProcessMain(?sSocket?fm->fileName)?==?0)
????{
????????printf(“\n處理函數出錯!“);
????}
int?i=0;
for?(i=0;?i {
if?(pBuff[i]!=NULL)
{
free(pBuff[i]);
}
}
gettimeofday(&tpendNULL);?
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+(tpend.tv_usec-tpstart.tv_usec);??
timeuse/=1000000;?
printf(“\n?run?finish!“);
printf(“\n整個程序共花時間:%f秒==%f分鐘\n“?timeusetimeuse/60);
close(sSocket);
????return?0;
}
int?InitOn()
{
int?i=0;
int?ret;
for?(i=0;?i {
ret=sem_init(&mutex[i]01);
if?(ret!=0)
{
perror(“sem_init“);
return?0;
}
}
ret=sem_init(&avail0BUFFNUM);?
if?(ret!=0)
{
perror(“sem_init“);
return?0;
}
ret=sem_init(&full00);
if?(ret!=0)
{
perror(“sem_init“);
return?0;
}
if?(ret!=0)
{
perror(“sem_init“);
}
for?(i=0;?i {
pBuff[i]?=?(char?*)malloc(sizeof(char)*
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????16704??2012-11-15?14:31??C?C++?Linux多線程文件程序\Client_NBuffer
?????文件???????12519??2012-11-15?14:30??C?C++?Linux多線程文件程序\Client_NBuffer.c
?????文件???????16437??2012-11-14?14:23??C?C++?Linux多線程文件程序\Server_NBuffer
?????文件???????11996??2012-11-14?14:14??C?C++?Linux多線程文件程序\Server_NBuffer.c
?????文件?????????472??2012-11-19?09:22??C?C++?Linux多線程文件程序\說明文檔.txt
?????目錄???????????0??2012-11-14?10:21??C?C++?Linux多線程文件程序\
- 上一篇:C語言程序設計大賽題目和答案
- 下一篇:C++api大全
評論
共有 條評論