資源簡介
基于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
評論
共有 條評論