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

📄 treadfunction.cpp

📁 Visual Studio.net 2003 基于Socket套接口
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "DataStructAndConstant.h"

#include "ToolFunction.h"
#include "TreadFunction.h"
#include "ProcessCommand.h"
DWORD WINAPI ServerWorkerThread(LPVOID ComlpetionPortID) 
{ 
	HANDLE ComplectionPort = (HANDLE) ComlpetionPortID; 
	DWORD dwBytesTransferred; 
	LPPER_HANDLE_DATA pPerHandleData; 
	LPPER_IO_OPERATION_DATA pPerIOData; 
	while (TRUE) 
	{ 
		if (GetQueuedCompletionStatus(ComplectionPort,&dwBytesTransferred,(LPDWORD)&pPerHandleData,(LPOVERLAPPED*)&pPerIOData,INFINITE) == 0) 
		{ 
			DWORD dwErrorCode=GetLastError();
			
			if(pPerHandleData->enCurrentHandleType==HandleData&&pPerIOData->IoType==DataIoTransPacket&&pPerHandleData->uHandleInfo.cDataInfo.bAbor==false)
			{//这是专门为了多线程下载文件使用的分支
				LPPER_SOCKET_DATA pCtrlSockData=(LPPER_SOCKET_DATA)(pPerHandleData->uHandleInfo.cDataInfo.pControlLinkSocketData);
				ControlSocketPureSendData(pCtrlSockData,"226 Transfer complete !\r\n");
				closesocket(pPerHandleData->Socket);
				if(pPerIOData->uIoInfo.cDataIoTransPacketInfo.hTmpFile!=INVALID_HANDLE_VALUE)	
				{
					CloseHandle(pPerIOData->uIoInfo.cDataIoTransPacketInfo.hTmpFile);
				}
				
			}
			else
			{
				printf("Socket %d 's GetQueuedCompletionStatus failed with error %d\n",pPerHandleData->Socket,dwErrorCode); 
			}/**/
			continue ; 
		}  
 
		if(dwBytesTransferred==0&&pPerIOData->IoType!=IoQuit&&pPerHandleData->enCurrentHandleType==HandleControl)//客户control端关闭连接
		{
			printf("Close Socket %d \r\n",pPerHandleData->Socket);
			closesocket(pPerHandleData->Socket);
			if(!DeleteVectorItem(pPerHandleData))
			{
				printf("Delete Error!\r\n");
			}

			continue;
		}
		if(pPerHandleData->enCurrentHandleType==HandleControl)//控制连接
		{
			LPPER_SOCKET_DATA pPerSocketData=(LPPER_SOCKET_DATA)pPerHandleData;
			switch(pPerIOData->IoType)
			{
			case ControlIoSend:
				{
					pPerIOData->uIoInfo.cControlIoSendInfo.dwSendedDataLength+=dwBytesTransferred;
					if(	pPerIOData->uIoInfo.cControlIoSendInfo.dwSendedDataLength==pPerIOData->cBuffer.len)
					{//全部发送完成
						switch (pPerIOData->uIoInfo.cControlIoSendInfo.enNextToDo)
						{
						case ToSendData:
							{
								LPPER_SOCKET_DATA pDataLinkPerSocketData=(LPPER_SOCKET_DATA)(pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketData);
								DWORD dwWaitResult=WaitForSingleObject(pPerHandleData->uHandleInfo.cCtrlInfo.EventDataValid,10000);
								if(dwWaitResult==WAIT_TIMEOUT||pDataLinkPerSocketData==NULL)
								{	
									printf("Data Link is invalid!\r\n");
									ControlSocketPureSendData((LPPER_SOCKET_DATA)pPerHandleData,"425 Can't open data connection.\r\n");
									ControlIoReceive(pPerHandleData,pPerIOData);		
									break;
								}
								TRANSMIT_PACKETS_ELEMENT cTransmitData;
								memcpy(&cTransmitData,pPerIOData->uIoInfo.cControlIoSendInfo.bWhatToDo,sizeof(TRANSMIT_PACKETS_ELEMENT));

								if(	cTransmitData.dwElFlags==TP_ELEMENT_MEMORY)//发送内存中的数据
								{
									TRANSMIT_FILE_BUFFERS strTransmitData;
									strTransmitData.Head=cTransmitData.pBuffer;
									strTransmitData.HeadLength=cTransmitData.cLength;
									strTransmitData.Tail=NULL;
									strTransmitData.TailLength=0;
									pDataLinkPerSocketData->cPerIoData.IoType=DataIoTransPacket;
									pDataLinkPerSocketData->cPerIoData.uIoInfo.cDataIoTransPacketInfo.hTmpFile=INVALID_HANDLE_VALUE;
									pDataLinkPerSocketData->cPerIoData.uIoInfo.cDataIoTransPacketInfo.uTotolFileSize=cTransmitData.cLength;
									if(pDataLinkPerSocketData->cPerHandleData.uHandleInfo.cDataInfo.bValid)
									{
										TransmitFile(pDataLinkPerSocketData->cPerHandleData.Socket,
													NULL,
													0,
													0,
													reinterpret_cast<LPOVERLAPPED>(&(pDataLinkPerSocketData->cPerIoData.Overlapped)),
													&strTransmitData,
													TF_USE_SYSTEM_THREAD);
										if (WSAGetLastError() != ERROR_IO_PENDING) 
										{ 
											printf("Socket %d TransmitFile failed with error %d\n",pPerHandleData->Socket,WSAGetLastError()); 
											ControlIoReceive(pPerHandleData,pPerIOData);
											break; 
										} 
									}
									else
									{
										printf("Data Link is invalid!\r\n");
										ControlSocketPureSendData((LPPER_SOCKET_DATA)pPerHandleData,"425 Can't open data connection.\r\n");
										ControlIoReceive(pPerHandleData,pPerIOData);
										
										break;
									}
								
								}
								else//通过句柄发送文件中的数据!
								{
									pDataLinkPerSocketData->cPerIoData.uIoInfo.cDataIoTransPacketInfo.hTmpFile=cTransmitData.hFile;
									pDataLinkPerSocketData->cPerIoData.IoType=DataIoTransPacket;
									pDataLinkPerSocketData->cPerIoData.uIoInfo.cDataIoTransPacketInfo.uTotolFileSize=cTransmitData.cLength;
									if(pDataLinkPerSocketData->cPerHandleData.uHandleInfo.cDataInfo.bValid)
									{
										TransmitFile(pDataLinkPerSocketData->cPerHandleData.Socket,
													cTransmitData.hFile,
													cTransmitData.cLength,
													0,
													reinterpret_cast<LPOVERLAPPED>(&(pDataLinkPerSocketData->cPerIoData.Overlapped)),
													NULL,
													TF_USE_SYSTEM_THREAD);
										if (WSAGetLastError() != ERROR_IO_PENDING) 
										{ 
											printf("Socket %d TransmitFile failed with error %d\n",pPerHandleData->Socket,WSAGetLastError()); 
											ControlIoReceive(pPerHandleData,pPerIOData);
											break; 
										} 
									}
									else
									{
										printf("Data Link is invalid!\r\n");
										ControlSocketPureSendData((LPPER_SOCKET_DATA)pPerHandleData,"425 Can't open data connection.\r\n");
										ControlIoReceive(pPerHandleData,pPerIOData);
										break;
									}
								}
								ControlIoReceive(pPerHandleData,pPerIOData);
								break;
							}
						case ToReceiveData:
							{
								TRANSMIT_PACKETS_ELEMENT cTransmitData;
								memcpy(&cTransmitData,pPerIOData->uIoInfo.cControlIoSendInfo.bWhatToDo,sizeof(TRANSMIT_PACKETS_ELEMENT));
								LPPER_SOCKET_DATA pDataLinkPerSocketData=(LPPER_SOCKET_DATA)(pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketData);
								DWORD dwWaitResult=WaitForSingleObject(pPerHandleData->uHandleInfo.cCtrlInfo.EventDataValid,10000);
								if(dwWaitResult==WAIT_TIMEOUT||pDataLinkPerSocketData==NULL||pDataLinkPerSocketData->cPerHandleData.uHandleInfo.cDataInfo.bValid==false)
								{	
									printf("Data Link is invalid!\r\n");
									ControlSocketPureSendData((LPPER_SOCKET_DATA)pPerHandleData,"425 Can't open data connection.\r\n");
									ControlIoReceive(pPerHandleData,pPerIOData);		
									break;
								}
								memset(&(pDataLinkPerSocketData->cPerIoData),0,sizeof(PER_IO_OPERATION_DATA));
								pDataLinkPerSocketData->cPerIoData.IoType=DataIoUpload;
								pDataLinkPerSocketData->cPerIoData.uIoInfo.cDataIoUploadInfo.hFileHandle=cTransmitData.hFile;
								pDataLinkPerSocketData->cPerIoData.uIoInfo.cDataIoUploadInfo.uReceivedFileSize=0;
								pDataLinkPerSocketData->cPerIoData.cBuffer.buf =pDataLinkPerSocketData->cPerIoData.stBuffer;
								pDataLinkPerSocketData->cPerIoData.cBuffer.len=BUFFERSIZE;
								DWORD RecvBytes=0,Flags=0;
								if (WSARecv(pDataLinkPerSocketData->cPerHandleData.Socket,&(pDataLinkPerSocketData->cPerIoData.cBuffer),1,&RecvBytes,&Flags,&(pDataLinkPerSocketData->cPerIoData.Overlapped),NULL) == SOCKET_ERROR) 
								{ 
									if (WSAGetLastError() != ERROR_IO_PENDING) 
									{ 
										printf("Socket %d WSARecv() failed with error %d\n",pPerHandleData->Socket,WSAGetLastError()); 
										break; 
									} 
								}
								ControlIoReceive(pPerHandleData,pPerIOData);
								break;
							}
						case ToReceive:
							{

								ControlIoReceive(pPerHandleData,pPerIOData);
								break;
							}
						case ToAbort:
							{
								LPPER_SOCKET_DATA pDataSocketData=(LPPER_SOCKET_DATA)(pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketData);
								ResetEvent(pPerHandleData->uHandleInfo.cCtrlInfo.EventDataValid);
								
								if(pDataSocketData!=NULL)
								{
									closesocket(pDataSocketData->cPerHandleData.Socket) ;
									CloseHandle(pPerHandleData->uHandleInfo.cCtrlInfo.hCurrentFileHandle);
									ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"226 ABOR command successful.\r\n");
									pPerHandleData->uHandleInfo.cCtrlInfo.pDataLinkSocketData=NULL;
								}
								else
								{
									ControlNormalSendData(pPerHandleData,pPerIOData,ToReceive,"504 Command not implemented .\r\n");
								}
								break;
							}
						case DoNothing:
							{
								memset(pPerIOData,0,sizeof(PER_IO_OPERATION_DATA));
								break;
							}
						default:
							{
								printf("Error NEXT TO Do VALUE");
								break;
							}
						}

					}
					else
					{//本次发送没能全部完成 需要继续发送
						if(	pPerIOData->uIoInfo.cControlIoSendInfo.dwSendedDataLength<pPerIOData->cBuffer.len)
						{
							pPerIOData->cBuffer.len-=pPerIOData->uIoInfo.cControlIoSendInfo.dwSendedDataLength;
							pPerIOData->cBuffer.buf+=pPerIOData->uIoInfo.cControlIoSendInfo.dwSendedDataLength;
							DWORD SendBytes=0;
							if(WSASend(pPerHandleData->Socket,&(pPerIOData->cBuffer),1,&SendBytes,0,&(pPerIOData->Overlapped),NULL) ==SOCKET_ERROR ) 
							{ 
								if (WSAGetLastError() != ERROR_IO_PENDING) 
								{ 
									printf(" Socket %d WSASend() fialed with error %d\n",pPerHandleData->Socket,WSAGetLastError()); 
									break;
								} 
							} 
						}
						else
						{

⌨️ 快捷键说明

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