资源简介
基于socket的文件传输示例,控制台简单进度与速度显示
代码片段和文件信息
#include“FileTransfer.h“
static int get_file_name(char* destchar* srcint dest_lenint src_len)
{
if(dest==NULL||src==NULL){
return 0;
}
int i=0;
for(i=src_len-1;i>=0;i--){
if(src[i]==‘\\‘){
break;
}
}
if(i==0){
return 0;
}
memset(dest0dest_len);
strncpy(dest&src[i+1]src_len-i-1);
return 1;
}
FileTransfer::FileTransfer()
{
}
FileTransfer::~FileTransfer()
{
}
int FileTransfer::start_listen(int port)
{
lis_socket_ = ::socket(AF_INET SOCK_STREAM IPPROTO_TCP);
if(lis_socket_ == INVALID_SOCKET){
return false;
}
// 填充sockaddr_in结构
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
// 绑定这个套节字到一个本地地址
if(::bind(lis_socket_ (LPSOCKADDR)&sin sizeof(sin)) == SOCKET_ERROR){
return false;
}
if(::listen(lis_socket_5)==SOCKET_ERROR){
return false;
};
HANDLE Hacc=(HANDLE) _beginthreadex(NULL0accept_funthis0NULL);
WaitForSingleobject(HaccINFINITE);
return true;
}
unsigned int __stdcall FileTransfer:: accept_fun(PVOID pM)
{
FileTransfer* transfer=(FileTransfer*)pM;
sockaddr_in client;
int sClientLength = sizeof(client);
SOCKET sClient = ::accept(transfer->lis_socket_(sockaddr*)&client &sClientLength);
transfer->process_con_msg(sClient);
return 0;
}
bool FileTransfer::process_con_msg( SOCKET& socket)
{
char* recBuf=new char[256];
ZeroMemory(recBufsizeof(256));
int nRec=::recv(socketrecBuf2560);
if(nRec<=0)
{
return false;
}
Msg* msgbase=(Msg*)recBuf;
switch(msgbase->op)
{
case SEND_FILE:
apply_file_recieve(socketmsgbase);
break;
}
return true;
}
bool FileTransfer::apply_file_recieve(SOCKET& socketMsg*& msgbase)
{
SendMsg* msgFile=(SendMsg*)msgbase;
char acc_file;
std::cout<<“请求文件传输:“<file_name<<“ 同意?(y/n)“< while(std::cin>>acc_file){
switch(acc_file){
case ‘y‘:
case ‘Y‘:
break;
case ‘n‘:
case ‘N‘:
closesocket(socket);
return false;
default:
std::cout<<“输入错误,重新输入“< continue;
};
break;
}
RecPrarm* thPrarm=new RecPrarm;
thPrarm->msg=msgFile;
thPrarm->socket=socket;
HANDLE Hrec=(HANDLE) _beginthreadex(NULL0recieve_funthPrarm0NULL);
WaitForSingleobject(HrecINFINITE);
return true;
}
unsigned int __stdcall FileTransfer:: file_connect(PVOID pM)
{
FileInfo* fileInfo=(FileInfo*)pM;
HANDLE file;
DWORD f_hsize;
file= CreateFile (fileInfo->file_path GENERIC_READ|GENERIC_WRITE \
FILE_SHARE_READ|FILE_SHARE_WRITE NULL OPEN_EXISTING FILE_ATTRIBUTE_NORMAL NULL ) ;
if(file == INVALID_HANDLE_VALUE )//尝试打开文件
{
std::cout<<“文件打开失败“< return 0;
}
SOCKET sClient = ::socket(AF_INET SOCK_STREAM IPPROTO_TCP);
SOCKADDR_IN sockAddr=fileInfo->sockAddr;
if(-1 ==:: connect(sClient (sockaddr*)&sockAddr si
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 85504 2013-04-11 15:19 socket文件传输\FileTransfer.exe
文件 5975 2013-04-11 15:19 socket文件传输\代码\FileTransfer.cpp
文件 938 2013-04-11 11:14 socket文件传输\代码\FileTransfer.h
文件 461 2012-07-11 16:12 socket文件传输\代码\intialSoket.h
文件 1218 2013-04-11 11:05 socket文件传输\代码\源.cpp
文件 33560 2013-04-11 15:21 socket文件传输\示例.PNG
目录 0 2013-04-11 15:24 socket文件传输\代码
目录 0 2013-04-11 15:24 socket文件传输
----------- --------- ---------- ----- ----
127656 8
相关资源
- 用c++设计一个日期类Date,包括年、月
- VC++ 实现增大可执行文件的体积 自
- c++ primer plus 第6版 中文版pdf 高清完整
- C++跑酷游戏
- C++简单的画图程序源代码
- c++ builder实现文件粉碎机的源码
- 简单电子英汉词典c++
- C++程序设计语言:第1~3部分原书第4版
- c++程序设计 谭浩强第二版答案
- c++学生信息管理系统附带报告
- C++builder编写的简单科学计算器
- C++ QT中 通过UDP广播获取网络中所有设
- 课程设计哲学家就餐问题报告+代码
- 网桥自学习算法
- 路由器分组转发算法_计算机通信课程
- C++下操作access数据库
- C++精确定时定时器
- c++链表队列的实现
- 快速Hartley变换C++实现
- 停车场管理问题 C++/C数据结构
- C++课设高校人员信息管理系统.doc
- B+树的实现算法c++版
- 学校信息管理系统_visual stdio c++ .net
- 操作系统课程设计 文件管理 C C++
- 观察者模式 c++ 实现
- 分水岭算法c++代码
- c++windows用户管理
- DTW算法VC++实现 源代码非常好,注释非
- C++ 转 C# 工具破解版
- VC++ 中实现进制2进制,10进制,16进制
评论
共有 条评论