C++之WSAAsyncSelect模型实例(3)
复制代码 代码如下: #include "TCPClient.h" #include "resource.h" #define WM_SOCKET WM_USER+1 CMyApp theApp; BOOL CMyApp::InitInstance() { //初始化套接字 WSADATA wsaData; WORD wVersionRequ
复制代码 代码如下:
#include "TCPClient.h"
#include "resource.h"
#define WM_SOCKET WM_USER+1
CMyApp theApp;
BOOL CMyApp::InitInstance()
{
//初始化套接字
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2,0);
::WSAStartup(wVersionRequested, &wsaData);
//显示对话框
CMainDialog dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
//释放套接字
::WSACleanup();
return FALSE;
}
//CMainDialog
CMainDialog::CMainDialog(CWnd* pParentWnd):CDialog(IDD_MAINDIALOG,pParentWnd)
{
}
BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
ON_BN_CLICKED(IDC_CONNECT, OnConnect)
ON_BN_CLICKED(IDC_SEND, OnSend)
ON_MESSAGE(WM_SOCKET, OnSocket)
END_MESSAGE_MAP()
void CMainDialog::OnCancel()
{
CDialog::OnCancel();
}
BOOL CMainDialog::OnInitDialog()
{
CDialog::OnInitDialog();
//设置图标
SetIcon(theApp.LoadIconA(IDI_MAIN), FALSE);
//关联控件
m_edit_text.SubclassDlgItem(IDC_EDIT_CONTENT, this);
//状态栏
m_bar.Create(WS_CHILD|WS_VISIBLE|SBS_SIZEGRIP, CRect(0, 0, 0,0), this, NULL);
int nWidth[]={100,-1};
m_bar.SetParts(2, nWidth);
m_bar.SetText("windows程序设计", 1, 0);
m_bar.SetText("空闲", 0, 0);
GetDlgItem(IDC_ADDR)->SetWindowTextA("192.168.19.143");
GetDlgItem(IDC_PORT)->SetWindowTextA("9999");
//
m_socket = INVALID_SOCKET;
return TRUE;
}
void CMainDialog::AddStringToList(CString strText)
{
CString strContent;
GetDlgItem(IDC_EDIT_CONTENT)->GetWindowText(strContent);
GetDlgItem(IDC_EDIT_CONTENT)->SetWindowText(strContent+strText);
}
long CMainDialog::OnSocket(WPARAM wParam, LPARAM lParam)
{
SOCKET s = wParam;
if (WSAGETSELECTERROR(lParam))
{
::closesocket(m_socket);
m_socket = INVALID_SOCKET;
return 0;
}
switch (WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
MessageBox("client:read");
char szText[1024]={0};
::recv(s, szText, 1024, 0);
AddStringToList(CString(szText)+"\r\n");
}
break;
case FD_CONNECT:
{
MessageBox("client:connect");
GetDlgItem(IDC_CONNECT)->SetWindowTextA("断开连接");
GetDlgItem(IDC_ADDR)->EnableWindow(FALSE);
GetDlgItem(IDC_PORT)->EnableWindow(FALSE);
GetDlgItem(IDC_TEXT)->EnableWindow(TRUE);
GetDlgItem(IDC_SEND)->EnableWindow(TRUE);
m_bar.SetText("已经连接到服务器", 0, 0);
}
break;
case FD_CLOSE:
{
MessageBox("client:close");
OnConnect();
}
break;
}
return 0;
}
BOOL CMainDialog::Connect(LPCTSTR pszRemoteAddr, u_short nPort)
{
//创建套接字
m_socket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == m_socket)
{
return FALSE;
}
::WSAAsyncSelect(m_socket, m_hWnd, WM_SOCKET, FD_READ|FD_WRITE|FD_CONNECT|FD_CLOSE);
ULONG uAddr = ::inet_addr(pszRemoteAddr);
if (uAddr == INADDR_NONE)
{
//不是IP地址,就认为是主机名称
//从主机名得到IP
hostent* pHost = ::gethostbyname(pszRemoteAddr);
if (pHost == NULL)
{
::closesocket(m_socket);
m_socket = INVALID_SOCKET;
return FALSE;
}
uAddr = ((struct in_addr*)*(pHost->h_addr_list))->s_addr;
}
//填写服务器信息
sockaddr_in remote;
remote.sin_family = AF_INET;
remote.sin_addr.S_un.S_addr = uAddr;
remote.sin_port = ::htons(nPort);
//连接
::connect(m_socket, (sockaddr*)&remote, sizeof(sockaddr));
return TRUE;
}
void CMainDialog::OnConnect()
{
if (INVALID_SOCKET == m_socket) //连接服务器
{
CString strAddr;
GetDlgItem(IDC_ADDR)->GetWindowText(strAddr);
if (strAddr.IsEmpty())
{
MessageBox("the servers IP is empty");
return;
}
CString strPort;
GetDlgItem(IDC_PORT)->GetWindowTextA(strPort);
int nPort = atoi(strPort);
if (nPort < 1 || nPort > 65535)
{
MessageBox("port error");
return;
}
if (Connect(strAddr, nPort) == FALSE)
{
MessageBox("connect to servers error...");
return;
}
//设置用户界面
GetDlgItem(IDC_CONNECT)->SetWindowText("取消");
m_bar.SetText("正在连接..", 0, 0);
}
else //断开服务器
{
::closesocket(m_socket);
m_socket = INVALID_SOCKET;
//设置用户界面
GetDlgItem(IDC_CONNECT)->SetWindowTextA("连接服务器");
m_bar.SetText("空闲", 0, 0);
GetDlgItem(IDC_ADDR)->EnableWindow(TRUE);
GetDlgItem(IDC_PORT)->EnableWindow(TRUE);
GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
GetDlgItem(IDC_TEXT)->EnableWindow(FALSE);
}
//this->Connect(szAddr, )
}
void CMainDialog::OnSend()
{
CString strSendContent;
GetDlgItem(IDC_TEXT)->GetWindowTextA(strSendContent);
::send(m_socket, strSendContent, strSendContent.GetLength(), 0);
GetDlgItem(IDC_TEXT)->SetWindowTextA("");
}
#include "resource.h"
#define WM_SOCKET WM_USER+1
CMyApp theApp;
BOOL CMyApp::InitInstance()
{
//初始化套接字
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2,0);
::WSAStartup(wVersionRequested, &wsaData);
//显示对话框
CMainDialog dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
//释放套接字
::WSACleanup();
return FALSE;
}
//CMainDialog
CMainDialog::CMainDialog(CWnd* pParentWnd):CDialog(IDD_MAINDIALOG,pParentWnd)
{
}
BEGIN_MESSAGE_MAP(CMainDialog, CDialog)
ON_BN_CLICKED(IDC_CONNECT, OnConnect)
ON_BN_CLICKED(IDC_SEND, OnSend)
ON_MESSAGE(WM_SOCKET, OnSocket)
END_MESSAGE_MAP()
void CMainDialog::OnCancel()
{
CDialog::OnCancel();
}
BOOL CMainDialog::OnInitDialog()
{
CDialog::OnInitDialog();
//设置图标
SetIcon(theApp.LoadIconA(IDI_MAIN), FALSE);
//关联控件
m_edit_text.SubclassDlgItem(IDC_EDIT_CONTENT, this);
//状态栏
m_bar.Create(WS_CHILD|WS_VISIBLE|SBS_SIZEGRIP, CRect(0, 0, 0,0), this, NULL);
int nWidth[]={100,-1};
m_bar.SetParts(2, nWidth);
m_bar.SetText("windows程序设计", 1, 0);
m_bar.SetText("空闲", 0, 0);
GetDlgItem(IDC_ADDR)->SetWindowTextA("192.168.19.143");
GetDlgItem(IDC_PORT)->SetWindowTextA("9999");
//
m_socket = INVALID_SOCKET;
return TRUE;
}
void CMainDialog::AddStringToList(CString strText)
{
CString strContent;
GetDlgItem(IDC_EDIT_CONTENT)->GetWindowText(strContent);
GetDlgItem(IDC_EDIT_CONTENT)->SetWindowText(strContent+strText);
}
long CMainDialog::OnSocket(WPARAM wParam, LPARAM lParam)
{
SOCKET s = wParam;
if (WSAGETSELECTERROR(lParam))
{
::closesocket(m_socket);
m_socket = INVALID_SOCKET;
return 0;
}
switch (WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
MessageBox("client:read");
char szText[1024]={0};
::recv(s, szText, 1024, 0);
AddStringToList(CString(szText)+"\r\n");
}
break;
case FD_CONNECT:
{
MessageBox("client:connect");
GetDlgItem(IDC_CONNECT)->SetWindowTextA("断开连接");
GetDlgItem(IDC_ADDR)->EnableWindow(FALSE);
GetDlgItem(IDC_PORT)->EnableWindow(FALSE);
GetDlgItem(IDC_TEXT)->EnableWindow(TRUE);
GetDlgItem(IDC_SEND)->EnableWindow(TRUE);
m_bar.SetText("已经连接到服务器", 0, 0);
}
break;
case FD_CLOSE:
{
MessageBox("client:close");
OnConnect();
}
break;
}
return 0;
}
BOOL CMainDialog::Connect(LPCTSTR pszRemoteAddr, u_short nPort)
{
//创建套接字
m_socket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == m_socket)
{
return FALSE;
}
::WSAAsyncSelect(m_socket, m_hWnd, WM_SOCKET, FD_READ|FD_WRITE|FD_CONNECT|FD_CLOSE);
ULONG uAddr = ::inet_addr(pszRemoteAddr);
if (uAddr == INADDR_NONE)
{
//不是IP地址,就认为是主机名称
//从主机名得到IP
hostent* pHost = ::gethostbyname(pszRemoteAddr);
if (pHost == NULL)
{
::closesocket(m_socket);
m_socket = INVALID_SOCKET;
return FALSE;
}
uAddr = ((struct in_addr*)*(pHost->h_addr_list))->s_addr;
}
//填写服务器信息
sockaddr_in remote;
remote.sin_family = AF_INET;
remote.sin_addr.S_un.S_addr = uAddr;
remote.sin_port = ::htons(nPort);
//连接
::connect(m_socket, (sockaddr*)&remote, sizeof(sockaddr));
return TRUE;
}
void CMainDialog::OnConnect()
{
if (INVALID_SOCKET == m_socket) //连接服务器
{
CString strAddr;
GetDlgItem(IDC_ADDR)->GetWindowText(strAddr);
if (strAddr.IsEmpty())
{
MessageBox("the servers IP is empty");
return;
}
CString strPort;
GetDlgItem(IDC_PORT)->GetWindowTextA(strPort);
int nPort = atoi(strPort);
if (nPort < 1 || nPort > 65535)
{
MessageBox("port error");
return;
}
if (Connect(strAddr, nPort) == FALSE)
{
MessageBox("connect to servers error...");
return;
}
//设置用户界面
GetDlgItem(IDC_CONNECT)->SetWindowText("取消");
m_bar.SetText("正在连接..", 0, 0);
}
else //断开服务器
{
::closesocket(m_socket);
m_socket = INVALID_SOCKET;
//设置用户界面
GetDlgItem(IDC_CONNECT)->SetWindowTextA("连接服务器");
m_bar.SetText("空闲", 0, 0);
GetDlgItem(IDC_ADDR)->EnableWindow(TRUE);
GetDlgItem(IDC_PORT)->EnableWindow(TRUE);
GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
GetDlgItem(IDC_TEXT)->EnableWindow(FALSE);
}
//this->Connect(szAddr, )
}
void CMainDialog::OnSend()
{
CString strSendContent;
GetDlgItem(IDC_TEXT)->GetWindowTextA(strSendContent);
::send(m_socket, strSendContent, strSendContent.GetLength(), 0);
GetDlgItem(IDC_TEXT)->SetWindowTextA("");
}
TCPClient.h头文件如下:
收藏文章
精彩图集
精彩文章