⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fxfilesend.cpp

📁 vc++6.0开发网络典型应用实例导航 1. 本光盘提供了本书中所有的实例源程序文件。 2. 附录文件夹下是Winsock 函数参考以及错误码列表
💻 CPP
字号:
// FXFileSend.cpp : implementation file
//

#include "stdafx.h"
#include "Netmsg.h"
#include "FXFileSend.h"
#include "FileSend.h"
#include "Contact.h"
#include "ContactView.h"
//#include <winsock2.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


CFXFileSend::CFXFileSend(CFileSocketThread *pThread, HANDLE File, unsigned long len)
{
	hFile = File;
	FileLen = len;
	Thread = pThread;
	Stop = false;
}

CFXFileSend::~CFXFileSend()
{
}


// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CFXFileSend, CSocket)
	//{{AFX_MSG_MAP(CFXFileSend)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0

/////////////////////////////////////////////////////////////////////////////
// CFXFileSend member functions

void CFXFileSend::OnConnect(int nErrorCode) 
{
	CSocket::OnConnect(nErrorCode);
}

bool CFXFileSend::SendFile()
{
	for (;;)
	{
		unsigned long read;
		char buf[PACKET_SIZE];

		if (Stop)
		{
			Close();
			Thread->TransferFailed();
			return false;
		}

		ReadFile(hFile, buf, PACKET_SIZE, &read, NULL);
		if (!read) break;
		Send(buf, read);
		if (WSAGetLastError()) return false;
		else
		{
			FileLen -= read;
			Thread->UpdateTransfered((int)read);
		}
		if (FileLen <= 0)
		{
			Thread->TransferComplete();
			return true;
		}
	}
	return false;
}

void CFXFileSend::OnReceive(int nErrorCode) 
{

}

CFXFileRecv::CFXFileRecv(CFileSocketThread *pThread, HANDLE File, unsigned long len)
{
	Thread = pThread;
	hFile = File;
	FileLen = len;
	Stop = false;
}

CFXFileRecv::~CFXFileRecv()
{
}


// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CFXFileRecv, CSocket)
	//{{AFX_MSG_MAP(CFXFileRecv)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0

/////////////////////////////////////////////////////////////////////////////
// CFXFileRecv member functions

void CFXFileRecv::OnConnect(int nErrorCode) 
{
	CSocket::OnConnect(nErrorCode);
}

void CFXFileRecv::OnReceive(int nErrorCode) 
{
	unsigned long written;
	int recvd;
	char buf[PACKET_SIZE];

	if (Stop)
	{
		Close();
		Thread->TransferFailed();
		return;
	}

	recvd = Receive(buf, PACKET_SIZE);
	if (WSAGetLastError()) 
	{
		Thread->TransferFailed();
		return;
	}
	FileLen -= recvd;
	WriteFile(hFile, buf, recvd, &written, NULL);
	Thread->UpdateTransfered(recvd);
	if (FileLen <= 0)
	{
		Thread->TransferComplete();
	}
}

// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CFXListen, CSocket)
	//{{AFX_MSG_MAP(CFXFileRecv)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0

CFXListen::CFXListen(CFileSocketThread *thread)
{
	FileThread = thread;
}

CFXListen::~CFXListen()
{
}


void CFXListen::OnAccept(int nErrorCode) 
{
	FileThread->SendSock = new CFXFileSend(FileThread, FileThread->hFile, FileThread->FileLen);
	Accept(*FileThread->SendSock);
	FileThread->TransferStarted();
	if (!FileThread->SendSock->SendFile())
	{
		if (FileThread->Sending)
		FileThread->TransferFailed();
	}
	else
	FileThread->TransferComplete();
	CSocket::OnAccept(nErrorCode);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -