📄 receivefile.cpp
字号:
// ReceiveFile.cpp: implementation of the CReceiveFile class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Client.h"
#include "ReceiveFile.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CReceiveFile::CReceiveFile()
{
}
CReceiveFile::~CReceiveFile()
{
}
int CReceiveFile::Client( CString strIP ,CString filemsg)
{
int nResult = 0;
//1、启动Winsock:对Winsock DLL进行初始化,协商Winsock的版本支持并分配必要的资源。(服务器端和客户端)
WORD wVersion = MAKEWORD( 2, 0 );
WSADATA wsData;
nResult = WSAStartup( wVersion, &wsData );
if( nResult !=0 )
{
return SOCK_WSA_ERR;
}
//2、创建套接字:(服务器端和客户端)
SOCKET s = socket( AF_INET, SOCK_STREAM, 0 );
if( s == INVALID_SOCKET )
{
return SOCK_CRSOCK_ERR; //错误处理
}
unsigned long uladdr;
uladdr = inet_addr(strIP);
//sock=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in sa;
memset(&sa,0,sizeof(sa));
sa.sin_family=AF_INET;
sa.sin_port=htons(8439);
sa.sin_addr.S_un.S_addr=uladdr;
nResult = connect(s,(const sockaddr*)&sa,sizeof(sa));
//4、套接字的连结:将两个套接字连结起来准备通信。(客户端)
/*int connect(SOCKET s, const struct sockaddr FAR * name, int namelen )
s为欲连结的已创建的套接字。
name为欲连结的socket地址。
namelen为socket地址的结构的长度。*/
/*unsigned long uladdr;
uladdr = inet_addr("192.168.3.48");
sockaddr_in addr;
memset( &addr , 0x00 , sizeof( addr ));
addr. sin_family = AF_INET;
addr. sin_port = htons(SVR_PORT); //保证字节顺序
addr. sin_addr.s_addr = htonl( uladdr ); //保证字节顺序
nResult = connect( s, ( sockaddr*)&addr, sizeof( sockaddr ) );*/
if( nResult == SOCKET_ERROR )
{
return SOCK_CONNECT_ERR; //错误处理
}
//6、 套接字的数据接收:(客户端)
nResult = RecevData( s ,filemsg);
if(nResult < 0 )
{
return nResult; //错误处理
}
//7、 关闭套接字:释放所占有的资源。(服务器端和客户端)
nResult=closesocket(s);
if(nResult==SOCKET_ERROR)
{
//错误处理
}
return TRAN_SUCCESS;
}
//---------------------------------------------------------------------------------
int CReceiveFile::RecevData( SOCKET s ,CString filemsg)
{
FILE* stream;
struct Fileinfo fileinfo;
int nRet = 0;
unsigned long dataLength /*cbBytesRet*/, cbLeftToReceive;
BYTE* recdData = NULL;
memset( &fileinfo, 0x00, sizeof(fileinfo) );
nRet = recv( s , ( char *)&fileinfo, sizeof(fileinfo), 0 );
if( nRet == SOCKET_ERROR )
{
return SOCKET_ERROR;
}
if( ( stream = fopen( filemsg, "wb") ) == NULL)
{
return FILE_ERR;
}
// char *tt;
// nRet = send( s, ( char *)"OK" , sizeof( "OK" ),0 );
dataLength = fileinfo.fileSize;
recdData = new byte[RECV_BUFFER_SIZE];
cbLeftToReceive = dataLength;
int ii=0;
do
{
int iiGet, iiRecd;
iiGet = ( cbLeftToReceive < RECV_BUFFER_SIZE ) ? cbLeftToReceive : RECV_BUFFER_SIZE ;
iiRecd = recv( s, ( char *)recdData, iiGet, 0 );
// test for errors and get out if they occurred
if ( iiRecd == SOCKET_ERROR || iiRecd == 0 )
{
return SOCK_RECVE_ERR;
}
printf("%d\n",ii++);
fwrite( recdData, iiRecd, 1, stream ); // Write it
cbLeftToReceive -= iiRecd;
send(s, (char *)&ii,sizeof(ii),0);
}
while ( cbLeftToReceive > 0 );
return TRAN_SUCCESS;
}
void CReceiveFile::PrintReturn( int nRet)
{
switch( nRet )
{
case TRAN_SUCCESS: AfxMessageBox("TRAN_SUCCESS"); break; //传输成功
case SOCK_WSA_ERR: AfxMessageBox("SOCK_WSA_ERR"); break; //启动winsock失败
case SOCK_CRSOCK_ERR: AfxMessageBox("SOCK_CRSOCK_ERR"); break; //创建套接字失败
case SOCK_BIND_ERR: AfxMessageBox("SOCK_BIND_ERR"); break; //绑定端口失败
case SOCK_LISTEN_ERR: AfxMessageBox("SOCK_LISTEN_ERR"); break; //监听失败
case SOCK_ACCEPT_ERR: AfxMessageBox("SOCK_ACCEPT_ERR"); break; //等待连接失败
case SOCK_SEND_ERR: AfxMessageBox("SOCK_SEND_ERR"); break; //发送数据失败
case SOCK_CLOSE_ERR: AfxMessageBox("SOCK_CLOSE_ERR"); break; //关闭 SOCKET失败
case SOCK_RECVE_ERR: AfxMessageBox("SOCK_RECVE_ERR"); break; //接受数据失败
case SOCK_CONNECT_ERR: AfxMessageBox("SOCK_CONNECT_ERR"); break;
case FILE_ERR: AfxMessageBox("FILE_ERR"); break; //文件错误
case Other_ERR: AfxMessageBox("Other_ERR"); break; //其他不明原因
default: AfxMessageBox("NO ERROR");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -