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

📄 remote_n.cpp

📁 winsail v2.0是用于DOS下的图形界面空间系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//文件长度
	long lgLength = pFilePage->dwFileLen;
	

	bSuccess = TRUE;

	//计算数据包的帧数目
	DWORD dwPages = ((lgLength / ETHERNET_FILEHEAD_MAXPAGESIZE) +
		(((lgLength % ETHERNET_FILEHEAD_MAXPAGESIZE) != 0L)?1:0));
	DWORD dwOffset = lgLength % ETHERNET_FILEHEAD_MAXPAGESIZE;

	pProgressCtrl1->SetRange(0, dwPages - 1);

	//将数据发送给客户机
	for (DWORD  i = 0; i < dwPages; i++)
	{
		//接收文件头
		if (!::QueryNetcardPage(hAfxRemoteSocket, TRUE, 5000))
		{
			bSuccess = FALSE;
			break;
		}

		nFromLen = sizeof(sockaddr_in);
		nLen = ::recvfrom(hAfxRemoteSocket, (char *)pRemoteControlPage, 512,
			0, (sockaddr *)&mPeerAddr, &nFromLen);

		if ((nLen == 0 || nLen == SOCKET_ERROR) ||
			pRemoteControlPage->wFlags != WINSAIL_REMOTE_FLAGS ||
			pRemoteControlPage->wLength != (WORD)nLen ||
			pRemoteControlPage->wCommand != REMOTE_WINSAIL_RECVFILE_ACK ||
			0 != ::GetEthernetChecksum((WORD *)pRemoteControlPage, nLen, FALSE) ||
			//=====================================================================
			pFilePage->wVersion != ETHERNET_FILEHEAD_VERSION ||
			pFilePage->wServer != 1 ||
			pFilePage->wHeadLen <= sizeof(REMOTE_CMD_FILEHEAD_PAGE ) - 1 ||
			pFilePage->wHeadLen > sizeof(REMOTE_CMD_FILEHEAD_PAGE ) - 1 +
				ETHERNET_FILEHEAD_MAXPAGESIZE  ||
			pFilePage->dwIndex != i ||
			//=============================================================
			mPeerAddr.sin_port != pToAddr->sin_port||
			mPeerAddr.sin_addr.S_un.S_addr != pToAddr->sin_addr.S_un.S_addr)
		{
			bSuccess = FALSE;
			break;
		}

		int nExt = pFilePage->wHeadLen - (sizeof(REMOTE_CMD_FILEHEAD_PAGE) - 1);
		if (i + 1 != dwPages && nExt != ETHERNET_FILEHEAD_MAXPAGESIZE ||
			(i + 1 == dwPages && dwOffset != 0 && nExt != (int)dwOffset))
		{
			bSuccess = FALSE;
			break;
		}


		int nReadData = pFilePage->wHeadLen - (sizeof(REMOTE_CMD_FILEHEAD_PAGE ) - 1);
		::fwrite(pData, 1, nReadData, pFile);

		pProgressCtrl1->AddShow(i);

		if (!::SendRemoteOK(hAfxRemoteSocket, &mPeerAddr))
		{
			bSuccess = FALSE;
			break;
		}

	}




	//如果没有错,接收End包
	while (bSuccess)
	{
		//计算End包的长度
		nSize = sizeof(REMOTE_CONTROL_PAGE) +
			(sizeof(REMOTE_CMD_FILEHEAD_PAGE) - 1);

		//查询End
		if (!::QueryNetcardPage(hAfxRemoteSocket, TRUE, 5000))
		{
			bSuccess = FALSE;
			break;
		}

		//接收End包
		nFromLen = sizeof(sockaddr_in);
		nLen = ::recvfrom(hAfxRemoteSocket, (char *)pRemoteControlPage, 512,
			0, (sockaddr *)&mPeerAddr, &nFromLen);

		//判断End包
		if ((nLen == 0 || nLen == SOCKET_ERROR || nLen != nSize) ||
			pRemoteControlPage->wFlags != WINSAIL_REMOTE_FLAGS ||
			pRemoteControlPage->wLength != (WORD)nLen ||
			pRemoteControlPage->wCommand != REMOTE_WINSAIL_RECVFILE_ACK ||
			0 != ::GetEthernetChecksum((WORD *)pRemoteControlPage, nLen, FALSE) ||
			//=====================================================================
			pFilePage->wVersion != ETHERNET_FILEHEAD_VERSION ||
			pFilePage->wServer != 1 ||
			pFilePage->wHeadLen != (sizeof(REMOTE_CMD_FILEHEAD_PAGE) - 1) ||
			pFilePage->dwIndex != 0xFFFFFFFElu ||
			//==============================================================
			mPeerAddr.sin_port != pToAddr->sin_port||
			mPeerAddr.sin_addr.S_un.S_addr != pToAddr->sin_addr.S_un.S_addr)
		{
			bSuccess = FALSE;
			break;
		}


		//发送OK包
		if (!::SendRemoteOK(hAfxRemoteSocket, &mPeerAddr))
		{
			bSuccess = FALSE;
			break;
		}

		//Break;
		break;
	}

	//关闭文件
	fclose(pFile);

	//释放缓冲区
	delete pRemoteControlPage;

	//拷贝文件
	if (bSuccess)
	{
		bSuccess = ::CopyFile("abc.$$$", pFileName, FALSE);
		if (bSuccess)
		{
			::SendRemoteOK(hAfxRemoteSocket, &mPeerAddr);
		}
		else
		{
			::SendRemoteFail(hAfxRemoteSocket, &mPeerAddr);
		}
	}
	return(bSuccess);
}

BOOL far SendRectScreen(SOCKET hSocket, int nLeft,
	int nTop,int nRight, int nBottom, sockaddr_in* pToAddr)
{
	BOOL bResult = TRUE;
	int nMaxSize= 320;

	BYTE* pBuffer = new BYTE[sizeof(REMOTE_CONTROL_PAGE) +
		sizeof(REMOTE_CMD_BITMAP_PAGE) + nMaxSize + 4];

    REMOTE_CONTROL_PAGE *pControlPage = (REMOTE_CONTROL_PAGE *)pBuffer;
    REMOTE_CMD_BITMAP_PAGE *pBitmapPage =
		(REMOTE_CMD_BITMAP_PAGE *)&pBuffer[sizeof(REMOTE_CONTROL_PAGE)];

    ::_fmemset(pControlPage, 0 , sizeof(REMOTE_CONTROL_PAGE));
    ::_fmemset(pBitmapPage, 0 , sizeof(REMOTE_CMD_BITMAP_PAGE));


	pControlPage->wFlags = WINSAIL_REMOTE_FLAGS ;
    pControlPage->wCommand = REMOTE_WINSAIL_BITMAP;

    pBitmapPage->nLeft = nLeft;
    pBitmapPage->nTop = nTop;
    pBitmapPage->nRight = nRight;
    pBitmapPage->nBottom = nBottom;

    int nIndex = 0;
    int nPoint = 0;
    BYTE* byData = pBuffer + sizeof(REMOTE_CONTROL_PAGE) +
		sizeof(REMOTE_CMD_BITMAP_PAGE);

    BYTE* pMemory = (BYTE *)MK_FP(0xA000u, 0x0);

    int nOldPage = nAfxScreenPage;

	int nPage = 0;
	if (nAfxScreenColor == 256)
    {
		::KernelChangePage(0, - 1);
    }

    long lgTotalCount = 0;
    for (int i = nTop; i <= nBottom; i++)
    {
    	if (!bResult)
        {
        	break;
        }
	    for (int j = nLeft; j <= nRight; j++)
    	{
        	nPoint++;
            int nColor;
			if (nAfxScreenColor == 16 ||
				bAfxPcm3486Display || bAfxSed1335Display)
			{
				nColor = (WORD)::GetPixel(j, i);
            }
            else
            {
				nColor = (int)(WORD)*(pMemory++);
                if (*((WORD *)&pMemory) == 0)
                {
				    pMemory = (BYTE *)MK_FP(0xA000u, 0x0);
                    ::KernelChangePage(++nPage, -1);
                }
            }

            if (nColor > 0)
            {
            	nColor = nColor -  1 + 0x1E;
            }
            *(byData++) = (BYTE)nColor;

            if (nPoint >= nMaxSize || (i == nBottom && j == nRight))
            {
				pControlPage->wCheckSum = 0;
                pControlPage->wLength = sizeof(REMOTE_CONTROL_PAGE) +
					sizeof(REMOTE_CMD_BITMAP_PAGE) + nPoint;

                pBitmapPage->nIndex = nIndex;

				pControlPage->wCheckSum = ::GetEthernetChecksum(
					(WORD *)pBuffer, pControlPage->wLength, FALSE);

            	 if (0 != ::sendto(hSocket, pBuffer, pControlPage->wLength,
					0, (sockaddr *)pToAddr, sizeof(sockaddr_in)))
                 {
                 	bResult = FALSE;
                    break;
                 }

				 if (!::ReceiveRemoteOK(hSocket, pToAddr))
                 {
                 	bResult = FALSE;
                    break;
                 }


                //KernelDelay(1);

            	nIndex++;
            	nPoint = 0;
            	byData = pBuffer + sizeof(REMOTE_CONTROL_PAGE) +
					sizeof(REMOTE_CMD_BITMAP_PAGE);

                if (nAfxScreenColor == 256 &&
					((i - nTop) % 10) == 0 && i != nTop)
                {
                	if (bAfxPcm3486Display || bAfxSed1335Display)
                    {
                    	::KernelDelay(5);
                    }
                    else
                    {
                		::AfxMicroDelay(MICRODELAY_TIME_5);
                    }
                }
            }
	    }

    }

    if (nAfxScreenColor == 256)
    {
    	::KernelChangePage(nOldPage, -1);
    }
    delete pBuffer;
	return(bResult);
}



//nSeek == 0 --> Create Client Remote Socket
//nSeek == 1 --> Normal Client Remote Socket
//nSeek == 2 --> Close  Client Remote Socket
BOOL RemoteContorlClient(int nSeek)
{
	SOCKET hSocket = hAfxRemoteSocket;
    if (nSeek == 0)
    {
		if (hAfxRemoteSocket != INVALID_SOCKET)
        {
        	return(FALSE);
        }

	    hSocket = ::socket(AF_INET, SOCK_DGRAM, 0);

		//初始化客户端地址
		sockaddr_in mClientAddr;
        _fmemset(&mClientAddr, 0 ,sizeof(sockaddr_in));
		mClientAddr.sin_family = AF_INET;
		mClientAddr.sin_addr.S_un.S_addr = *((DWORD *)
			(BYTE *)&mAfxIpSelfAddr[0]);
		mClientAddr.sin_port = htons(wAfxRemoteSocket);

		if (SOCKET_ERROR == ::bind(hSocket,
			(sockaddr *)&mClientAddr,sizeof(sockaddr_in)))
		{
			::closesocket(hSocket);
			return(FALSE);
		}

    	hAfxRemoteSocket = hSocket;

		//::AfxRegisterRemoteMouseFc(RemoteFcMouse);
        return(TRUE);
	}
    else if (nSeek == 2)
    {
		if (hSocket == INVALID_SOCKET)
        {
        	return(FALSE);
        }

        ::closesocket(hSocket);
        hAfxRemoteSocket = INVALID_SOCKET;
        //::AfxRegisterRemoteMouseFc(NULL);
        return(TRUE);
    }

	if (nSeek != 1 || hSocket == INVALID_SOCKET ||
		!QueryNetcardPage(hSocket, TRUE, 0))
    {
    	return(FALSE);
    }

	char buf[512];
	sockaddr_in mFromAddr;

    int nFromLen = sizeof(sockaddr_in);
	int nSize = ::recvfrom(hSocket, buf, 512, 0,
		(struct sockaddr FAR *)&mFromAddr, &nFromLen);

    if (nSize < sizeof(REMOTE_CONTROL_PAGE))
    {
    	return(FALSE);
    }


	REMOTE_CONTROL_PAGE* pRemoteControlPage = (REMOTE_CONTROL_PAGE *)buf;

    if (pRemoteControlPage->wFlags != WINSAIL_REMOTE_FLAGS ||
        pRemoteControlPage->wLength != (WORD)nSize ||
		0 != ::GetEthernetChecksum((WORD *)buf, nSize, FALSE))
	{
    	return(FALSE);
	}

    BOOL bResult = FALSE;
    switch (pRemoteControlPage->wCommand)
    {
    	case REMOTE_WINSAIL_KEYBOARD:
        {
	    	if (nSize != sizeof(REMOTE_CONTROL_PAGE))
    	    {
        		return(FALSE);
	        }
    	    ::AddKeyboard(pRemoteControlPage->wKey);

            bResult = TRUE;
        	break;
        }
        case REMOTE_WINSAIL_BEATHEART:
        {
			::sendto(hSocket, buf, nSize, 0,
				(struct sockaddr FAR *)&mFromAddr, nFromLen);

            bResult = TRUE;
            break;
        }
		case REMOTE_WINSAIL_BITMAP:
        {
			REMOTE_CMD_BITMAP_PAGE *pBitmapPage =
				(REMOTE_CMD_BITMAP_PAGE *)&buf[sizeof(REMOTE_CONTROL_PAGE)];

            if (nSize != sizeof(REMOTE_CONTROL_PAGE) +
            	sizeof(REMOTE_CMD_BITMAP_PAGE))
            {
            	break;
            }

        	int nMouse = ::GetMouse();
	        ::CloseMouse();

			bResult = ::SendRectScreen(hSocket, pBitmapPage->nLeft, pBitmapPage->nTop,
				pBitmapPage->nRight, pBitmapPage->nBottom, &mFromAddr);

	        ::SetMouse(nMouse);
        	break;
        }
		case REMOTE_WINSAIL_MOUSELEFT:
		case REMOTE_WINSAIL_MOUSERIGHT:
		case REMOTE_WINSAIL_MOUSEMOVE:
		{
			REMOTE_CMD_MOUSE_PAGE *pMousePage =
				(REMOTE_CMD_MOUSE_PAGE *)&buf[sizeof(REMOTE_CONTROL_PAGE)];

            if (nSize != sizeof(REMOTE_CONTROL_PAGE) +
            	sizeof(REMOTE_CMD_MOUSE_PAGE))
            {
            	break;
            }


			::AfxSetRemoteMouse(pMousePage->nX,
				pMousePage->nY, pMousePage->nStatus);

            bResult = TRUE;
        	break;
        }
		case REMOTE_WINSAIL_SENDFILE_REQ:
		case REMOTE_WINSAIL_RECVFILE_REQ:
		{
			REMOTE_CMD_FILEHEAD_PAGE *pFilePage =
				(REMOTE_CMD_FILEHEAD_PAGE *)&buf[sizeof(REMOTE_CONTROL_PAGE)];

            if (pFilePage->wServer != 1 ||
				pFilePage->wVersion != ETHERNET_FILEHEAD_VERSION ||
				pFilePage->wHeadLen != nSize - sizeof(REMOTE_CONTROL_PAGE) ||
				pFilePage->wHeadLen > (sizeof(REMOTE_CMD_FILEHEAD_PAGE) - 1 +
						ETHERNET_FILEHEAD_MAXPAGESIZE) ||
				nSize - sizeof(REMOTE_CONTROL_PAGE) <
						sizeof(REMOTE_CMD_FILEHEAD_PAGE) - 1)
            {
				break;
			}


			if (pRemoteControlPage->wCommand == REMOTE_WINSAIL_SENDFILE_REQ)
			{
				CDialog* pDialog = ::DoWithReceiveFile(TRUE, (const char *)pFilePage->byData);
				pDialog->ShowWindow();

				bResult = ::SendFileToEthernet(hSocket,
					(const char *)pFilePage->byData, &mFromAddr, (DWORD)pDialog);

				delete pDialog;
			}
			else if(pRemoteControlPage->wCommand == REMOTE_WINSAIL_RECVFILE_REQ)
			{
				CDialog* pDialog = ::DoWithReceiveFile(FALSE, (const char *)pFilePage->byData);
				pDialog->ShowWindow();


				bResult = ::ReceiveFileFromEthernet(hSocket,
					(const char *)pFilePage->byData, &mFromAddr, (DWORD)pDialog);

				delete pDialog;
			}
			else
			{
				bResult = FALSE;
            }

            break;
        }
    	default:
        {
        	bResult = FALSE;
        	break;
        }
    }

    return(bResult);
}



⌨️ 快捷键说明

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