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

📄 tcpserver_ft.cpp

📁 文件传输代码
💻 CPP
字号:
// TCPServer_FT.cpp: implementation of the CTCPServer_FT class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "TCPServer_FT.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTCPServer_FT::CTCPServer_FT()
{

}

CTCPServer_FT::~CTCPServer_FT()
{

}

//重载构造函数,添加参数:指向窗口的指针
CTCPServer_FT::CTCPServer_FT(CString strFileName,LPVOID ptr)
{
	m_iListenPort = 7000;
	m_bEndListenThread = TRUE;
	m_pWnd = (CWnd*)ptr;
	m_strFileName=strFileName;
}
//功能:设置监听端口
//参数:端口号
//返回:无
void CTCPServer_FT::SetListenPort(int iPort)
{
	m_iListenPort = iPort;
}

//功能:开始监听客户端文件请求
//参数:指向接受消息的窗口的指针
//返回:无
void CTCPServer_FT::ListenRequest()
{
	m_bEndListenThread = FALSE;

	DWORD id;
	HANDLE h = CreateThread(NULL, 0, ThreadListen, this, 0, &id);
	CloseHandle(h);
}

//功能:停止监听
//参数:无
//返回:无
void CTCPServer_FT::StopListen()
{
	m_bEndListenThread = TRUE;
}
void CTCPServer_FT::SetFileName(CString strFileName)
{
	m_strFileName=strFileName;
}
//功能:监听线程
//参数:LPVOID lpParam
//返回:无意义
DWORD WINAPI CTCPServer_FT::ThreadListen(LPVOID lpParam)
{
	CTCPServer_FT* pServer = (CTCPServer_FT*)lpParam;

	SOCKET sockListen = socket(AF_INET, SOCK_STREAM, 0);
	SOCKADDR_IN sin;
	sin.sin_family = AF_INET;
	sin.sin_addr.s_addr = 0;
	sin.sin_port = htons(pServer->m_iListenPort);

	if(bind(sockListen, (SOCKADDR*)&sin, sizeof(sin)) == SOCKET_ERROR)
	{
		closesocket(sockListen);
		if(pServer->m_pWnd)
		pServer->m_pWnd->SendMessage(WM_BINDERROR);
		return 1;
	}

	if(listen(sockListen, 5) == SOCKET_ERROR)
	{
		closesocket(sockListen);
		if(pServer->m_pWnd)
		pServer->m_pWnd->SendMessage(WM_LISTENERROR);
		return 1;
	}

	if(pServer->m_pWnd)
	pServer->m_pWnd->SendMessage(WM_STARTLISTEN);

	fd_set fdListen;
	timeval seltime;
	seltime.tv_sec = 0;
	seltime.tv_usec = 10000;

	while(!pServer->m_bEndListenThread)
	{
		FD_ZERO(&fdListen);
		FD_SET(sockListen, &fdListen);

		if(select(0, &fdListen, NULL, NULL, &seltime) <= 0 || !FD_ISSET(sockListen, &fdListen) )
			continue;

		int len = sizeof(sin);
		SOCKET sock = accept(sockListen, (SOCKADDR*)&sin, &len);

		PARAMRECV* pParamRecv = new PARAMRECV;
		pParamRecv->sock = sock;
		pParamRecv->ptr = pServer;

		DWORD id;
		HANDLE h = CreateThread(NULL, 0, ThreadRecv, pParamRecv, 0, &id);
		CloseHandle(h);
	}
	closesocket(sockListen);
	return 0;
}


//功能:接收线程
//参数:LPVOID lpParam
//返回:无意义
DWORD WINAPI CTCPServer_FT::ThreadRecv(LPVOID lpParam)
{
	PARAMRECV* pParam = (PARAMRECV*)lpParam;
	CTCPServer_FT* pServer = (CTCPServer_FT*)pParam->ptr;
	
	fd_set fdRecv;
	timeval seltime;
	seltime.tv_sec = 0;
	seltime.tv_usec = 10000;
	
	while(1)
	{
		FD_ZERO(&fdRecv);
		FD_SET(pParam->sock, &fdRecv);
		
		if(select(0, &fdRecv, NULL, NULL, &seltime) <= 0 || !FD_ISSET(pParam->sock, &fdRecv) )
			continue;
		
		MSGREQUEST msgRequest;
		int iRecvCnt = recv(pParam->sock, (char*)&msgRequest, sizeof(msgRequest), 0);
		if(iRecvCnt <= 0)
			break;
		
		//如果是请求文件列表
		if(msgRequest.iCommand == FILELIST)
		{
			if(pServer->m_pWnd)
			pServer->m_pWnd->SendMessage(WM_SENDFILELIST, (WPARAM)&pParam->sock, 0);
		}
		
		//如果是请求文件数据
		else if(msgRequest.iCommand == FILEDATA)
		{
			long lFileOffset = msgRequest.lFileOffset;
			CFile file;
			BOOL bResult = file.Open(pServer->m_strFileName, CFile::modeRead|CFile::shareDenyNone, NULL);
			if(!bResult)
			{
				break;		//如果文件打开失败就终止线程
			}
			int nFileLength=file.GetLength();
			send(pParam->sock, (char*)&nFileLength, sizeof(nFileLength), 0);
			char sSendBuf[SENDSIZE];			
			while(lFileOffset < nFileLength)
			{
				int iSeek = file.Seek(lFileOffset, CFile::begin);
				int iReadCnt = file.Read(sSendBuf, SENDSIZE);
				if(iReadCnt ==0)
					break;

				int iSendCnt = send(pParam->sock, sSendBuf, iReadCnt, 0);
					
				//如果发送失败就终止线程
				if(iSendCnt == -1)
					break;
				else
					lFileOffset += iSendCnt;
			}//end of while(lFileOffset < lFileLength)
			
			file.Close();
		}//end of else if(msgRequest.iCommand == FILEDATA)

		break;
	}//end of while(1)	
	closesocket(pParam->sock);
	delete pParam;
	return 0;
}



⌨️ 快捷键说明

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