MFC - 文件发送接收

来源:互联网 发布:淘宝信用卡套现骗局 编辑:程序博客网 时间:2024/05/22 12:45
//FileSend.h文件发送类#pragma onceclass CFileSend{public:CFileSend(void);~CFileSend(void);public:SOCKET coket;CFile file;public:char* UnicodeToAnsi( const wchar_t* szStr );void CreateSocket();void Connect(DWORD IP,int port);void TestSend();void SendFileName(LPCTSTR FileName);void SendFile();};//FileSend.cpp文件发送类#include "StdAfx.h"#include "FileSend.h"CFileSend::CFileSend(void){WSADATA wsaData;BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);if(ret != 0){AfxMessageBox(_T("初始化网络协议失败!"));return;}}CFileSend::~CFileSend(void){file.Close();closesocket(coket);WSACleanup();}char* CFileSend::UnicodeToAnsi( const wchar_t* szStr ) { int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL ); if (nLen == 0) { return NULL; } char* pResult = new char[nLen]; WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL ); return pResult; }void CFileSend::CreateSocket(){coket = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if (INVALID_SOCKET==coket){WSACleanup();AfxMessageBox(_T("创建监听套接字失败!"));return;}}void CFileSend::Connect(DWORD IP,int port){sockaddr_in sockaddr;sockaddr.sin_family = AF_INET;sockaddr.sin_port = htons(port);sockaddr.sin_addr.S_un.S_addr = htonl(IP);int ret = ::connect(coket,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));if(SOCKET_ERROR == ret){::closesocket(coket);WSACleanup();AfxMessageBox(_T("连接失败!"));return;}}void CFileSend::TestSend(){char buf[100];ZeroMemory(buf,100);buf[90] = 't';buf[91] = 'x';int len = ::send(coket,buf,100,0);if (len!=100){closesocket(coket);        WSACleanup();AfxMessageBox(_T("文件发送失败!"));return;}ZeroMemory(buf,100);::recv(coket,buf,100,0);while(1){if( buf[90] == 't' && buf[91] == 'x' ){CString inFo;inFo = buf;//AfxMessageBox(_T("数据已收到!"));break;}}}void CFileSend::SendFileName(LPCTSTR FileName){file.Open(FileName,CFile::modeRead|CFile::typeBinary);CString m_FileName = file.GetFileName();char* m_name = UnicodeToAnsi(m_FileName.GetBuffer());int m_len = strlen(m_name)+1;int len = ::send(coket,m_name,m_len,0);if (len!=m_len){file.Close();closesocket(coket);        WSACleanup();AfxMessageBox(_T("文件发送失败!"));return;}}void CFileSend::SendFile(){DWORD filelen=file.GetLength();BYTE buffer[4096];memset(buffer,0,4096);while (filelen>0){DWORD readbyte=file.Read(buffer,4096);int realsend=::send(coket,(char*)buffer,readbyte,0);if (realsend!=readbyte){file.Close();closesocket(coket);         WSACleanup();AfxMessageBox(_T("文件发送失败!"));return;}else if (realsend==SOCKET_ERROR){file.Close();AfxMessageBox(_T("连接已经断开!"));closesocket(coket);        WSACleanup();return;}filelen=filelen-readbyte;}}//FileRecv.h文件接收类#pragma onceclass CFileRecv{public:CFileRecv(void);~CFileRecv();public:SOCKET m_Socket;CString FileName;public:void CreateSocket();void Bind(CString IP,int port);void Listen(int Count);SOCKET Accept();void TestRecv(SOCKET s);void RecvFileName(SOCKET s);void RecvFile(SOCKET s,CString Path);char* UnicodeToAnsi( const wchar_t* szStr );};//FileRecv.cpp文件接收类#include "StdAfx.h"#include "FileRecv.h"CFileRecv::CFileRecv(void){WSADATA wsaData;BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);if(ret != 0){AfxMessageBox(_T("初始化网络协议失败!"));return;}}CFileRecv::~CFileRecv(){::closesocket(m_Socket);WSACleanup();}void CFileRecv::CreateSocket(){m_Socket = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if (INVALID_SOCKET==m_Socket){WSACleanup();AfxMessageBox(_T("创建监听套接字失败!"));return;}}void CFileRecv::Bind(CString IP,int port){sockaddr_in sockaddr;sockaddr.sin_family = AF_INET;sockaddr.sin_port = htons(port);sockaddr.sin_addr.S_un.S_addr = inet_addr(UnicodeToAnsi(IP.GetBuffer()));int ret = ::bind(m_Socket,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));if(SOCKET_ERROR == ret){::closesocket(m_Socket);WSACleanup();AfxMessageBox(_T("绑定失败!"));return;}}void CFileRecv::Listen(int Count){int ret = ::listen(m_Socket,Count);if(SOCKET_ERROR == ret){::closesocket(m_Socket);WSACleanup();AfxMessageBox(_T("监听失败!"));return;}}SOCKET CFileRecv::Accept(){sockaddr_in so_addr;int len = sizeof(SOCKADDR);SOCKET s = ::accept(m_Socket,(SOCKADDR*)&so_addr,&len);if (s==INVALID_SOCKET)    {AfxMessageBox(_T("接收失败!"));return 0;    }return s;}void CFileRecv::TestRecv(SOCKET s){char buf[100];ZeroMemory(buf,100);::recv(s,buf,100,0);while(1){if( buf[90] == 't' && buf[91] == 'x' ){CString inFo;inFo = buf;//AfxMessageBox(_T("数据已收到!"));break;}}ZeroMemory(buf,100);buf[90] = 't';buf[91] = 'x';int len = ::send(s,buf,100,0);}void CFileRecv::RecvFileName(SOCKET s){char buf[100];ZeroMemory(buf,100);::recv(s,buf,100,0);FileName = buf;}void CFileRecv::RecvFile(SOCKET s,CString Path){CFile file(Path + FileName,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary );BYTE buffer[4096];memset(buffer,0,4096);while(1){int rec=::recv(s,(char*)buffer,4096,0);if(rec == 0){break;}if(rec>0){file.Write(buffer,rec);}else{CString filename=_T("文件接收完毕!保存路径为") + Path + FileName;AfxMessageBox(filename);break;}if (rec==SOCKET_ERROR)        {            AfxMessageBox(_T("连接已经中断!"));break;}}file.Close();::closesocket(s);}char* CFileRecv::UnicodeToAnsi( const wchar_t* szStr ) { int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL ); if (nLen == 0) { return NULL; } char* pResult = new char[nLen]; WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL ); return pResult; }例子:接收类CFileRecv FileRecv;FileRecv.CreateSocket();CString IP;this->GetDlgItem(IDC_EDIT1)->GetWindowText(IP);FileRecv.Bind(IP,10001);FileRecv.Listen(5);SOCKET s = FileRecv.Accept();FileRecv.TestRecv(s);FileRecv.RecvFileName(s);FileRecv.RecvFile(s,_T("D:\\"));发送类CFileSend FileSend;FileSend.CreateSocket();DWORD IP;((CIPAddressCtrl*)this->GetDlgItem(IDC_IPADDRESS1))->GetAddress(IP);FileSend.Connect(IP,10001);FileSend.TestSend();FileSend.SendFileName(_T("C:\\123.zip"));FileSend.SendFile();

0 0
原创粉丝点击