📄 remote_n.cpp
字号:
//文件长度
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 + -