资源简介
基于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++中头文件与源文件的作用详解
- 基于mfc的多线程文件传输
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- C语言代码高亮html输出工具
- 猜数字游戏 c语言代码
- C语言课程设计
- 数字电位器C语言程序
- CCS FFT c语言算法
- 使用C语言编写的病房管理系统
- 通信过程中的RS编译码程序(c语言)
- 利用C++哈希表的方法实现电话号码查
- 计算机二级C语言上机填空,改错,编
- 用回溯法解决八皇后问题C语言实现
- 移木块游戏,可以自编自玩,vc6.0编写
- 简易教务管理系统c语言开发文档
- 操作系统课设 读写者问题 c语言实现
- 小波变换算法 c语言版
- C流程图生成器,用C语言代码 生成C语
- 3des加密算法C语言实现
- 简单的C语言点对点聊天程序
- 单片机c语言源程序(51定时器 八个按
- C++纯文字DOS超小RPG游戏
- 个人日常财务管理系统(C语言)
- MFC数字钟(基于VC6.0)
- c语言电子商务系统
- 小甲鱼C语言课件 源代码
- 将图片转换为C语言数组的程序
- 安科瑞智能电能表MODBUS通讯程序 VC6
- C语言实现的一个内存泄漏检测程序
评论
共有 条评论