// FSView.cpp : CFSView 类的实现
//
#include "stdafx.h"
#include "FS.h"
#include "FSDoc.h"
#include "FSView.h"
#include <winsock.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CFSView
IMPLEMENT_DYNCREATE(CFSView, CFormView)
BEGIN_MESSAGE_MAP(CFSView, CFormView)
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)
END_MESSAGE_MAP()
// CFSView 构造/销毁
CFSView::CFSView()
: CFormView(CFSView::IDD)
, IPAddress(0)
, nPort(2222)
, ComName(_T(""))
, recthread_flag(false)
{
// TODO: 在此处添加构造代码
}
CFSView::~CFSView()
{
}
void CFSView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_IPAddress(pDX, IDC_IPADDRESS1, IPAddress);
DDX_Control(pDX, IDC_IPADDRESS1, MIPAddressCtrl);
DDX_Text(pDX, IDC_EDIT1, nPort);
DDX_Text(pDX, IDC_EDIT2, ComName);
DDX_Control(pDX, IDC_BUTTON2, Listen_title);
DDX_Control(pDX, IDC_PROGRESS1, ProgressCtrl1);
}
BOOL CFSView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
// 样式
return CFormView::PreCreateWindow(cs);
}
void CFSView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
}
// CFSView 诊断
#ifdef _DEBUG
void CFSView::AssertValid() const
{
CFormView::AssertValid();
}
void CFSView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CFSDoc* CFSView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFSDoc)));
return (CFSDoc*)m_pDocument;
}
#endif //_DEBUG
// CFSView 消息处理程序
void CFSView::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog MDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"所有文件 (*.*)|*.*||");
MDlg.DoModal();
m_strFileName = MDlg.GetFileName();
}
void CFSView::OnBnClickedButton2()
{
// 线程的结束和开始
UpdateData(true);
UINT ReceiveDataThread(LPVOID lpParam);
if (!recthread_flag)
{
recthread_flag = true;
Listen_title.SetWindowText("Drop");
pThread = AfxBeginThread(ReceiveDataThread,this,THREAD_PRIORITY_NORMAL); //开始线程
}
else
{
recthread_flag = false;
Listen_title.SetWindowText("Listen");
pThread->ExitInstance();
}
}
void CFSView::OnBnClickedButton3() //client 发送文件的一方
{
// 连接服务器,并且发送文件长度,name过去
UpdateData(true);
SOCKET theSocket;
LPHOSTENT lpHostEntry;
lpHostEntry = gethostbyname(ComName);
theSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN saServer; //address structure
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = htonl(IPAddress); //*((LPIN_ADDR)*lpHostEntry->h_addr_list); //sever的地址
saServer.sin_port = nPort;
int nRet;
nRet = connect(theSocket,(LPSOCKADDR)&saServer,sizeof(struct sockaddr));
CFile file;
if( !file.Open(m_strFileName, CFile::modeRead) )
{
AfxMessageBox("打开文件出错!");
return ;
}
int uiLength = file.GetLength()/256; //需要传送的块数
int endLength = file.GetLength()%256; //文件最后一块的长度
char file_seg[256];
CString FileInfo;
FileInfo = file.GetFileName();
nRet = send(theSocket,FileInfo,sizeof(FileInfo),0); //传送文件名字到接收方(sever)
::Sleep(50);
file_seg[0]=uiLength;
file_seg[1]=endLength;
nRet = connect(theSocket,(LPSOCKADDR)&saServer,sizeof(struct sockaddr));
nRet = send(theSocket,file_seg,sizeof(file_seg),0); //传送文件大小到接受方
for(int n=0;n<=uiLength ; n++)
{
if (n == uiLength) //到了文件的末尾
{
file.Read(file_seg,endLength);
nRet = connect(theSocket,(LPSOCKADDR)&saServer,sizeof(struct sockaddr));
nRet = send(theSocket,file_seg,sizeof(file_seg),0);
ProgressCtrl1.SetPos(int(n/uiLength*100));
return ;
}
file.Read(file_seg,sizeof(file_seg));
nRet = connect(theSocket,(LPSOCKADDR)&saServer,sizeof(struct sockaddr));
nRet = send(theSocket,file_seg,sizeof(file_seg),0); //传送文件块到接受方
ProgressCtrl1.SetPos(int(n/uiLength*100));
}
}
UINT ReceiveDataThread(LPVOID lpParam) //SEVER
{
WORD wVersionRequested = MAKEWORD(1,1);
WSADATA wsaData;
SOCKET ListenSocket;
ListenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN saServer; //address structure
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = INADDR_ANY; //Let WinSock supply address
saServer.sin_port = 2222; //get Port
int nRet;
nRet = bind(ListenSocket,(LPSOCKADDR)&saServer,sizeof(struct sockaddr));
if (nRet == SOCKET_ERROR)
{
closesocket(ListenSocket);
return 1;
}
int nLen;
nLen = sizeof(SOCKADDR);
char szBuf[256];
nRet = gethostname(szBuf,sizeof(szBuf)); //获取主机名
if (nRet == SOCKET_ERROR)
{
closesocket(ListenSocket);
return 1;
}
nRet = listen(ListenSocket,SOMAXCONN); //监听
if (nRet == SOCKET_ERROR)
{
closesocket(ListenSocket);
return 1;
}
SOCKET remoteSocket;
remoteSocket = accept(ListenSocket,NULL,NULL); //accept
//保存文件对话框
CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"所有文件 (*.*)|*.*||");
dlg.DoModal();
CFile rc_File;
rc_File.Open(dlg.GetPathName(),CFile::modeCreate | CFile::modeWrite);
memset(szBuf,0,sizeof(szBuf));
nRet = recv(remoteSocket,szBuf,sizeof(szBuf),0); //接收文件名
nRet = send(remoteSocket,szBuf,strlen(szBuf),0); //reply
AfxMessageBox(szBuf);
nRet = recv(remoteSocket,szBuf,sizeof(szBuf),0);
nRet = send(remoteSocket,szBuf,strlen(szBuf),0); //reply
int F_Seg_N = szBuf[0]; //文件块数
int F_End_L = szBuf[1]; //文件最后一块的长度
for(int n=0;n<=F_Seg_N;n++)
{
if(n==F_Seg_N)
{
nRet = recv(remoteSocket,szBuf,F_End_L,0);
nRet = send(remoteSocket,szBuf,F_End_L,0);
rc_File.Write(szBuf,F_End_L);
return 0;
}
nRet = recv(remoteSocket,szBuf,sizeof(szBuf),0);
nRet = send(remoteSocket,szBuf,strlen(szBuf),0);
rc_File.Write(szBuf,sizeof(szBuf));
}
return 0;
}