?? udpexampledlg.cpp
字號:
// UDPExampleDlg.cpp : implementation file
//
#include "stdafx.h"
#include "UDPExample.h"
#include "UDPExampleDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CUDPExampleDlg dialog
CUDPExampleDlg::CUDPExampleDlg(CWnd* pParent /*=NULL*/)
: CDialog(CUDPExampleDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CUDPExampleDlg)
m_RemoteHost = _T("");
m_RemotePort = 0;
m_SendEdit = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CUDPExampleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUDPExampleDlg)
DDX_Control(pDX, IDC_DISCONNECT, m_ButDisConnect);
DDX_Control(pDX, IDC_CREATE_CONNECT, m_ButCreConnect);
DDX_Text(pDX, IDC_REMOTEHOST, m_RemoteHost);
DDX_Text(pDX, IDC_REMOTEPORT, m_RemotePort);
DDX_Text(pDX, IDC_SEND_EDIT, m_SendEdit);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CUDPExampleDlg, CDialog)
//{{AFX_MSG_MAP(CUDPExampleDlg)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_CREATE_CONNECT, OnCreateConnect)
ON_BN_CLICKED(IDC_DISCONNECT, OnDisconnect)
ON_BN_CLICKED(IDC_SEND, OnSend)
ON_BN_CLICKED(IDC_CLEAR_RECDISP, OnClearRecdisp)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUDPExampleDlg message handlers
BOOL CUDPExampleDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
// TODO: Add extra initialization here
m_RemoteHost="192.168.0.16";
m_RemotePort=1011;
m_strRecDisp=_T("");//清空接收區字符
m_Socket=INVALID_SOCKET;
m_ButDisConnect.EnableWindow(FALSE);
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
void CUDPExampleDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
OnDisconnect();
}
void CUDPExampleDlg::OnCreateConnect()
{
// TODO: Add your control notification handler code here
WSADATA wsa;
DWORD IDThread;
if(WSAStartup(MAKEWORD(1,1),&wsa)!=0)
{
MessageBox(_T("加載套接字失敗!"));
return;
}
m_Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_Socket==INVALID_SOCKET)
{
WSACleanup();
MessageBox(_T("創建套接字失敗!"));
return;
}
UpdateData(TRUE);
m_RemoteAddr.sin_family=AF_INET;
m_RemoteAddr.sin_port=htons(m_RemotePort);
char charRemoteHost[255];
ZeroMemory(charRemoteHost,255);
int len=m_RemoteHost.GetLength();
if(len>25)
{
MessageBox(_T("輸入遠程IP長度超長!"));
return;
}
LPTSTR pStr=m_RemoteHost.GetBuffer(len);
WideCharToMultiByte(CP_ACP,0,pStr,len,charRemoteHost,len,NULL,NULL);
DWORD ipaddress=inet_addr(charRemoteHost);
if((INADDR_NONE==ipaddress)||(0==ipaddress))
{
MessageBox(_T("輸入遠程IP地址格式不正確!"));
return;
}
m_RemoteAddr.sin_addr.s_addr=ipaddress;
int ret=connect(m_Socket,(struct sockaddr*)&m_RemoteAddr,sizeof(m_RemoteAddr));
if(ret==SOCKET_ERROR)
{
MessageBox(_T("連接TCP服務器失敗!"));
return;
}
DWORD ul=1;
ioctlsocket(m_Socket,FIONBIO,&ul);
m_ExitThreadEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
HANDLE hRecvThread=CreateThread(0,0,TCPRecvTread,this,0,&IDThread);
if(hRecvThread==NULL)
{
closesocket(m_Socket);
MessageBox(_T("創建TCP接收線程失敗!"));
}
CloseHandle(hRecvThread);
m_ButDisConnect.EnableWindow(TRUE);
m_ButCreConnect.EnableWindow(FALSE);
}
void CUDPExampleDlg::OnDisconnect()
{
// TODO: Add your control notification handler code here
if(m_ExitThreadEvent!=NULL)
{
SetEvent(m_ExitThreadEvent);
Sleep(1000);
CloseHandle(m_ExitThreadEvent);
}
if(m_Socket!=INVALID_SOCKET)
{
if(closesocket(m_Socket)==SOCKET_ERROR)
{
MessageBox(_T("關閉Socket失敗!"));
return;
}
m_Socket=INVALID_SOCKET;
if(WSACleanup()==SOCKET_ERROR)
MessageBox(_T("釋放Socket資源失敗!"));
}
m_ButDisConnect.EnableWindow(FALSE);
m_ButCreConnect.EnableWindow(TRUE);
}
DWORD CUDPExampleDlg::TCPRecvTread(LPVOID lparam)
{
fd_set fdRead;
TIMEVAL aTime;
int iErrorCode;
int ret;
aTime.tv_sec=1;
aTime.tv_usec=0;
CUDPExampleDlg *pDlg=(CUDPExampleDlg *)lparam;
while(TRUE)
{
if(WaitForSingleObject(pDlg->m_ExitThreadEvent,0)==WAIT_OBJECT_0)
break;
FD_ZERO(&fdRead);
FD_SET(pDlg->m_Socket,&fdRead);
ret=select(0,&fdRead,NULL,NULL,&aTime);
if(ret==SOCKET_ERROR)
{
iErrorCode=WSAGetLastError();
pDlg->OnTcpError(pDlg,iErrorCode);
break;
}
if(ret>0)
{
if(FD_ISSET(pDlg->m_Socket,&fdRead))
{
char *recvBuf=new char[1024];
int recvlen=(pDlg->m_Socket,recvBuf,1024,0);
if((recvlen==SOCKET_ERROR)||(recvlen==0))
{
iErrorCode=WSAGetLastError();
pDlg->OnTcpError(pDlg,iErrorCode);
delete[] recvBuf;
break;
}
else
{
pDlg->OnTcpRecv(pDlg,recvBuf,recvlen);
delete[] recvBuf;
}
}//end of if(FD_ISSET(pDlg->m_Socket,&fdRead))
}//end of if(ret>0)
}//end of while(TRUE)
return 0;
}
void CALLBACK CUDPExampleDlg::OnTcpRecv(CWnd * pWnd,char *buf,int buflen)
{
CString strTmp;
CUDPExampleDlg* pDlg=(CUDPExampleDlg* )pWnd;
CEdit *pRecvStrEdit=(CEdit *)pDlg->GetDlgItem(IDC_REC_DISP);
for(int i=0;i<buflen;i++)
{
strTmp.Format(_T("%c"),*buf);
pDlg->m_strRecDisp+=strTmp;
buf++;
}
pRecvStrEdit->SetWindowText(pDlg->m_strRecDisp);
}
void CALLBACK CUDPExampleDlg::OnTcpError(CWnd *pWnd,int nErrorCode)
{
}
void CUDPExampleDlg::OnSend()
{
// TODO: Add your control notification handler code here
int nErrorCode;
int cnt=0,actlen=0;
if(m_Socket==NULL)
return;
UpdateData(TRUE);
int sendlen=m_SendEdit.GetLength();
char *psendbuff=new char[sendlen];
for(int i=0;i<sendlen;i++)
psendbuff[i]=(char)m_SendEdit.GetAt(i);
while(cnt<sendlen)
{
actlen=send(m_Socket,psendbuff+cnt,sendlen-cnt,0);
if(actlen==SOCKET_ERROR)
{
MessageBox(_T("TCP數據發送失敗!"));
nErrorCode=WSAGetLastError();
delete[] psendbuff;
return;
}
cnt=cnt+actlen;
if(cnt<sendlen)
Sleep(1000);
}
delete[] psendbuff;
}
void CUDPExampleDlg::OnClearRecdisp()
{
// TODO: Add your control notification handler code here
m_strRecDisp=_T("");
CEdit *pRecDispEdit=(CEdit *)GetDlgItem(IDC_REC_DISP);
pRecDispEdit->SetWindowText(m_strRecDisp);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -