#include "MainDialog.h"
#include "Utility.h"
#include "SimpleQueue.h"
#include <WindowsX.h>
//////////////////////////////////////////////////////////////////////////
#pragma comment(lib, "IOCP")
#pragma comment(lib, "SimpleQueue")
//////////////////////////////////////////////////////////////////////////
enum
{
UM_NEW_SERVER = WM_USER + 0x1000,
UM_SHOW_IMAGE = WM_USER + 0x1001,
UM_HIDE_SCREEN = WM_USER + 0x1002,
};
//////////////////////////////////////////////////////////////////////////
enum
{
FLAG_HEAD = 1,
FLAG_BODY = 2,
};
//////////////////////////////////////////////////////////////////////////
VOID PostRecvHead(HANDLE hIOCP, SOCKET_INFO *pInfo, SOCKET_POST_IMAGE *pPost)
{
pPost->pWSABuf = &(pPost->wsaBuf[0]);
pPost->dwBufCount = ItemCount(pPost->wsaBuf);
pPost->pktHead.dwLength = 0;
pPost->wsaBuf[0].len= sizeof(PacketHead);
pPost->wsaBuf[0].buf= (PCHAR) &(pPost->pktHead);
pPost->dwLeftSize = pPost->wsaBuf[0].len;
pPost->dwRecvFlag = FLAG_HEAD;
pPost->pktHead.dwStamp = 0;
IOCP_PostRecv(hIOCP, pInfo, pPost);
}
VOID PostRecvBody(HANDLE hIOCP, SOCKET_INFO *pInfo, SOCKET_POST_IMAGE *pPost, DWORD dwLength)
{
pPost->pWSABuf = &(pPost->wsaBuf[0]);
pPost->dwBufCount = ItemCount(pPost->wsaBuf);
pPost->wsaBuf[0].len= dwLength;
pPost->wsaBuf[0].buf= pPost->szBuffer;
pPost->dwLeftSize = pPost->wsaBuf[0].len;
pPost->dwRecvFlag = FLAG_BODY;
pPost->pktHead.dwStamp = 0;
IOCP_PostRecv(hIOCP, pInfo, pPost);
}
//////////////////////////////////////////////////////////////////////////
template <typename HandleT>
VOID WINAPI EventCallback(IOCPCallback *pCallback)
{
HandleT *pHandle = ForceCast<HandleT *>(pCallback->dwContext);
switch (pCallback->dwEvent) {
case IOCP_EVENT_CONNECT:
break;
case IOCP_EVENT_ACCEPT:
pHandle->OnAccept(pCallback->pInfo);
break;
case IOCP_EVENT_RECV:
pHandle->OnRecv(pCallback->pPost);
break;
case IOCP_EVENT_SEND:
pHandle->OnSend(pCallback->pPost);
break;
case IOCP_EVENT_CLOSE:
pHandle->OnClose(pCallback->pPost);
break;
}
}
//////////////////////////////////////////////////////////////////////////
CMainDialog::CMainDialog(CWnd *pParent)
: CDialog(CMainDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CMainDialog)
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_dlgScreen.owner(this);
m_threadListen.owner(this);
//////////////////////////////////////////////////////////////////////////
m_hIOCP = NULL;
m_pInfo = (SOCKET_INFO *) GlobalAlloc(GPTR, sizeof(SOCKET_INFO));
SQ_Initialize(&m_hQueueSend, MAX_BUFFER_COUNT);
SQ_Initialize(&m_hQueueRecv, MAX_BUFFER_COUNT);
m_pSend = (SOCKET_POST_CTRL *) GlobalAlloc(GPTR, sizeof(SOCKET_POST_CTRL) * MAX_BUFFER_COUNT);
m_pRecv = (SOCKET_POST_IMAGE *) GlobalAlloc(GPTR, sizeof(SOCKET_POST_IMAGE) * MAX_BUFFER_COUNT);
SOCKET_POST_CTRL *pSend = m_pSend;
SOCKET_POST_IMAGE *pRecv = m_pRecv;
for (DWORD i=0; i<MAX_BUFFER_COUNT; ++i) {
pSend->hQueue = m_hQueueSend;
pRecv->hQueue = m_hQueueRecv;
pRecv->dwContextEx= ForceCast<DWORD>(this);
SQ_PushBack(m_hQueueSend, ForceCast<DWORD>(pSend));
SQ_PushBack(m_hQueueRecv, ForceCast<DWORD>(pRecv));
++pSend;
++pRecv;
}
//////////////////////////////////////////////////////////////////////////
SOCKADDR_IN addrUDP = { 0 };
addrUDP.sin_port = htons(BOARD_PORT);
addrUDP.sin_family = AF_INET;
addrUDP.sin_addr.s_addr = htonl(INADDR_ANY);
m_hBoardListen = ::WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0);
if (bind(m_hBoardListen, (SOCKADDR FAR *) &addrUDP, sizeof(addrUDP)) != SOCKET_ERROR) {
int nTimeout = 600;
if (setsockopt(m_hBoardListen, SOL_SOCKET, SO_RCVTIMEO, (char *) &nTimeout, sizeof(nTimeout)) != SOCKET_ERROR) {
nTimeout = 0;
}
}
}
void CMainDialog::DoDataExchange(CDataExchange *pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMainDialog)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
//{{AFX_MSG_MAP(CMainDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_COMMAND(IDC_BTN_CONNECT, OnBtnConnect)
ON_MESSAGE(UM_NEW_SERVER, OnNewServer)
ON_MESSAGE(UM_SHOW_IMAGE, OnShowImage)
ON_MESSAGE(UM_HIDE_SCREEN, OnHideScreen)
ON_LBN_SELCHANGE(IDC_LIST_SERVER, OnLstSelChangeServer)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
BOOL CMainDialog::OnInitDialog()
{
CDialog::OnInitDialog();
//////////////////////////////////////////////////////////////////////////
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
//////////////////////////////////////////////////////////////////////////
IOCP_Initialize(&m_hIOCP, EventCallback<CMainDialog>, ForceCast<DWORD>(this));
m_threadListen.Start(1);
return TRUE;
}
void CMainDialog::OnPaint()
{
if (IsIconic()) {
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else {
CDialog::OnPaint();
}
}
HCURSOR CMainDialog::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//////////////////////////////////////////////////////////////////////////
void CMainDialog::OnDestroy()
{
m_threadListen.Stop();
closesocket(m_hBoardListen);
m_hBoardListen = INVALID_SOCKET;
IOCP_Close(m_pInfo);
m_pInfo = NULL;
Sleep(1000);
IOCP_Uninitialize(m_hIOCP);
m_hIOCP = NULL;
SQ_Uninitialize(m_hQueueSend);
m_hQueueSend = NULL;
SQ_Uninitialize(m_hQueueRecv);
m_hQueueRecv = NULL;
GlobalFree(m_pSend);
m_pSend = NULL;
GlobalFree(m_pRecv);
m_pRecv = NULL;
GlobalFree(m_pInfo);
m_pInfo = NULL;
CDialog::OnDestroy();
}
//////////////////////////////////////////////////////////////////////////
void CMainDialog::OnLstSelChangeServer()
{
HWND hWnd = NULL;
GetDlgItem(IDC_LIST_SERVER, &hWnd);
if (hWnd == NULL) {
return;
}
INT nCurSel = ListBox_GetCurSel(hWnd);
if (nCurSel == LB_ERR) {
return;
}
CHAR szServerIP[64] = { 0 };
ListBox_GetText(hWnd, nCurSel, szServerIP);
SetDlgItemText(IDC_EDT_SERVERIP, szServerIP);
}
void CMainDialog::OnBtnConnect()
{
CHAR szServerIP[64] = { 0 };
GetDlgItemText(IDC_EDT_SERVERIP, szServerIP, sizeof(szServerIP));
if (szServerIP[0] == '\0') {
return;
}
//////////////////////////////////////////////////////////////////////////
SOCKET_POST_IMAGE *pPost = NULL;
SQ_PopFront(m_hQueueRecv, ForceCast<LPDWORD>(&pPost));
if ((pPost == NULL) || (IOCP_Connect(m_hIOCP, m_pInfo, szServerIP, 4096, 1000) != ERROR_SUCCESS)) {
MessageBox("Connect Failed!", "Infomation", MB_ICONINFORMATION);
}
else {
PostRecvHead(m_hIOCP, m_pInfo, pPost);
ShowWindow(SW_HIDE);
m_dlgScreen.Create(m_dlgScreen.IDD, this);
m_dlgScreen.ShowWindow(SW_SHOW);
m_dlgScreen.FullScreen();
}
}
void CMainDialog::OnPostNcDestroy(LPCVOID pDialog)
{
IOCP_Close(m_pInfo);
ShowWindow(SW_SHOW);
}
//////////////////////////////////////////////////////////////////////////
VOID PostSend(HANDLE hIOCP, SOCKET_INFO *pInfo, SOCKET_POST_CTRL *pPost, DWORD dwLength)
{
pPost->pWSABuf = &(pPost->wsaBuf[0]);
pPost->dwBufCount = ItemCount(pPost->wsaBuf);
pPost->pktHead.dwLength = dwLength;
pPost->wsaBuf[0].len= sizeof(PacketHead) + dwLength;
pPost->wsaBuf[0].buf= (PCHAR) &(pPost->pktHead);
pPost->dwLeftSize = pPost->wsaBuf[0].len;
pPost->pktHead.dwStamp = (pPost->pktHead.dwLength > 0) ? STAMP_PACKET : 0;
IOCP_PostSend(hIOCP, pInfo, pPost);
}
void CMainDialog::OnKeybdEvent(LPCVOID pDialog, UINT nChar, UINT nFlags)
{
SOCKET_POST_CTRL *pPost = NULL;
SQ_PopFront(m_hQueueSend, ForceC
没有合适的资源?快使用搜索试试~ 我知道了~
RemoteControl
共36个文件
h:15个
dll:4个
lib:4个
5星 · 超过95%的资源 需积分: 44 226 下载量 98 浏览量
2013-01-31
12:48:24
上传
评论 1
收藏 462KB 7Z 举报
温馨提示
一个远程控制程序,分为客户端和服务器两部分。编译环境 VS2005。
资源详情
资源评论
资源推荐
收起资源包目录
RemoteControl.7z (36个子文件)
bin
ThreadManager.dll 60KB
ControlClient.exe 284KB
ijl15.dll 364KB
SimpleQueue.dll 68KB
ControlServer.exe 376KB
IOCP.dll 64KB
ControlClient
Resource.h 684B
MainApplication.cpp 846B
res
ControlClient.rc2 405B
ControlClient.ico 1KB
Thumbs.db 6KB
MainDialog.h 2KB
ControlClient.vcproj 7KB
MainApplication.h 602B
ControlClient.sln 890B
Thread.h 3KB
DialogScreen.h 7KB
DynamicCreate.h 1KB
MainDialog.cpp 12KB
ControlClient.rc 5KB
NonModalImpl.h 880B
OwnerPolicy.h 751B
ControlServer
ControlServer.sln 890B
ControlServer.Cpp 12KB
ControlServer.vcproj 6KB
include
IOCP.h 2KB
PacketHead.h 2KB
JPEGEncoder.h 4KB
Utility.h 7KB
ijl.h 53KB
SimpleQueue.h 845B
OwnerPolicy.h 751B
lib
ijl15.lib 5KB
SimpleQueue.lib 3KB
ijl15l.lib 474KB
IOCP.lib 4KB
共 36 条
- 1
LiuYinChina
- 粉丝: 144
- 资源: 72
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论8