• 大小: 47KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-09
  • 语言: C/C++
  • 标签: socket  文件传输  C++  

资源简介

基于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


评论

共有 条评论