资源简介
基于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
相关资源
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- 基于mfc的多线程文件传输
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 文件传输和聊天程序(c语言实现)
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- 基于CS的TCP文件传输程序设计
- mfc 调用redis
评论
共有 条评论