• 大小: 21KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-09
  • 语言: C/C++
  • 标签: C  C++  Linux  多线程  

资源简介

基于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多线程文件程序\

评论

共有 条评论