资源简介
基于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大全
相关资源
- C++api大全
- C语言程序设计大赛题目和答案
- de Casteljau算法绘制Bezier曲线
- [c++中文化编程]之ComboBox组合框的类封
- 达内科技+c+++课件+及+源码+笔记
- C++ 源代码 学生考勤管理系统
- 模拟战争游戏
- 编译原理实验之四元式的生成源代码
- 基于C++的学生管理系统
- C++命令行实现的学生社团管理系统
- VC++和OpenGL实现八叉树分割
- C++宾馆管理系统
- 利用opencv做的垃圾检测代码
- C++经典算法100例
- C语言编写的前方交会代码
- SVR算法C++实现
- c语言课程设计 工资管理系统
- Frankot and Chellappa算法
- 实现对任意格式文件压缩 C++
- C++实现对文本(单纯文字,不是文本
- accelerated c++ 课后习题答案:原书作者提
- 字形轮廓提取显示C#源码
- 校级运动会 管理系统 c语言代码
- c++builder获取Cpu序列号代码
- C语言FFT
- 《C++面试宝典2015版》
- 使用c++实现用户登录界面
- djksrla最短路径算法C++实现
- 一个完整的C++ odbc连接数据库
- ARM2440定时器中断C语言版
评论
共有 条评论