自己写的一个使用CSocket的实例
2006-11-16 09:08
489 查看
图片借用一下别人的,我的程序是根据这个改的,因为感觉其CNewSocket耦合性太强,所以自己重新写了CNewSocket类。原代码中使用了CSocketFile和CArchive,我认为使用这2个类显得累赘,于是去掉了。
------------------------------------------------NewSocket.h-----------------------------------
#define WM_FD_ACCEPT WM_USER+1
#define WM_FD_RECEIVE WM_USER+2
#define WM_FD_CLOSE WM_USER+3
class CNewSocket : public CSocket
...{
// Attributes
public:
// Operations
public:
CNewSocket(HWND hwnd);
virtual ~CNewSocket();
// Overrides
public:
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CNewSocket)
//}}AFX_VIRTUAL
virtual void OnClose(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnAccept(int nErrorCode);
// Generated message map functions
//{{AFX_MSG(CNewSocket)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
private:
HWND m_hWnd;
// Implementation
protected:
};
------------------------------------------------NewSocket.CPP-----------------------------------
CNewSocket::CNewSocket(HWND hwnd)
...{
m_hWnd = hwnd;
}
CNewSocket::~CNewSocket()
...{
}
void CNewSocket::OnAccept(int nErrorCode)
...{
AfxMessageBox("OnAccept");
PostMessage(m_hWnd, WM_FD_ACCEPT, 0, 0);
CSocket::OnAccept( nErrorCode );
}
void CNewSocket::OnReceive(int nErrorCode)
...{
AfxMessageBox("OnReceive");
PostMessage(m_hWnd, WM_FD_RECEIVE, 0, 0);
CSocket::OnReceive( nErrorCode );
}
void CNewSocket::OnClose(int nErrorCode)
...{
PostMessage(m_hWnd, WM_FD_CLOSE, 0, 0);
CSocket::OnClose( nErrorCode );
}
------------------------------------------------SocketTestDlg.h-----------------------------------
CString m_IpAddress; //IP输入Edit框变量
CString m_Connect; //提示信息框
int m_nStatus; //状态变量
UINT m_Port; //端口输入Edit框变量
CString m_InPut; //用于接收的Edit框
CString m_OutPut; //用于发送的EDit框
//{{AFX_MSG(CSocketTestDlg)
…………
afx_msg void OnReceive();
afx_msg void OnAccept();
afx_msg void OnClose();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
------------------------------------------------SocketTestDlg.cpp-----------------------------------
CSocketTestDlg::CSocketTestDlg(CWnd* pParent /**//*=NULL*/)
: CDialog(CSocketTestDlg::IDD, pParent)
...{
//{{AFX_DATA_INIT(CSocketTestDlg)
m_IpAddress = _T("");
m_Connect = _T("");
m_nStatus = -1;
m_Port = 0;
m_InPut = _T("");
m_OutPut = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
BEGIN_MESSAGE_MAP(CSocketTestDlg, CDialog)
//{{AFX_MSG_MAP(CSocketTestDlg)
//………………
ON_MESSAGE(WM_FD_ACCEPT, OnAccept)
ON_MESSAGE(WM_FD_RECEIVE, OnReceive)
ON_MESSAGE(WM_FD_CLOSE, OnClose)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CSocketTestDlg::OnInitDialog()
...{
………………
m_nStatus = -1;
m_ServerSocket = NULL;
m_ClientSocket = NULL;
m_Connect = "";
m_IpAddress = "127.0.0.1";
m_Port = 7897;
GetDlgItem(IDC_IPADDRESS)->EnableWindow(FALSE);
GetDlgItem(IDC_PORTEDIT)->EnableWindow(FALSE);
}
void CSocketTestDlg::OnConnect()
...{
CString str_Msg;
UpdateData(TRUE);
if (0 == m_nStatus) //如果为服务器
...{
if (m_ServerSocket != NULL) //服务器Socket是否已经创建
...{
m_Connect = "Please disconnect!";
UpdateData(FALSE);
}
else
...{
m_Connect = "Wait for client...";
UpdateData(FALSE);
if (!AfxSocketInit()) //Socket初始化
...{
MessageBox("WindowSocket initial failed!", "Send", MB_ICONSTOP);
return;
}
//将Socket与窗口关联
m_ServerSocket = new CNewSocket(this->m_hWnd);
//如果创建Socket失败则提示,成功则开始监听
if (!m_ServerSocket->Create(m_Port))
...{
MessageBox("SendSocket Create failed!", "Send", MB_ICONSTOP);
}
else
...{
m_ServerSocket->Listen();
}
}
}
else if (1 == m_nStatus) //如果为客户端
...{
if (m_ClientSocket != NULL) //判断客户端Socket是否已经创建
...{
m_Connect = "Please disconnect!";
UpdateData(FALSE);
}
else
...{
m_Connect = "Connect to the server...";
UpdateData(FALSE);
if (!AfxSocketInit())
...{
MessageBox("WindowSocket initial failed!", "Receive", MB_ICONSTOP);
return;
}
m_ClientSocket = new CNewSocket(this->m_hWnd);;
if(!m_ClientSocket->Create())
...{
MessageBox("ReceiveSocket create failed!","Receive",MB_ICONSTOP);
return;
}
else
...{
if (!m_ClientSocket->Connect(m_IpAddress, m_Port))
...{
CString strTmp = m_Connect;
SocketReset();
m_Connect = strTmp;
m_Connect += "Error!";
UpdateData(FALSE);
}
else
...{
m_Connect += "OK!";
}
UpdateData(FALSE);
}
}
}
if (-1 == m_nStatus)
...{
str_Msg = "Please choose the status!";
AfxMessageBox(str_Msg);
}
}
void CSocketTestDlg::OnDisconnect()
...{
SocketReset();
m_Connect = "Disconnect!";
UpdateData(FALSE);
}
void CSocketTestDlg::OnSend()
...{
UpdateData(TRUE);
this->m_ClientSocket->Send(m_OutPut.GetBuffer(0), m_OutPut.GetLength());
}
void CSocketTestDlg::OnSendclear()
...{
m_OutPut = "";
UpdateData(FALSE);
}
void CSocketTestDlg::OnReceiveclear()
...{
m_InPut = "";
UpdateData(FALSE);
}
void CSocketTestDlg::OnExit()
...{
CDialog::OnOK();
}
void CSocketTestDlg::SocketReset()
...{
if (m_ServerSocket != NULL)
...{
delete m_ServerSocket;
m_ServerSocket = NULL;
}
if (m_ClientSocket != NULL)
...{
delete m_ClientSocket;
m_ClientSocket = NULL;
}
m_Connect = "";
UpdateData(FALSE);
}
void CSocketTestDlg::OnClose()
...{
if (0 == m_nStatus)
...{
m_Connect = "Client";
}
else
...{
m_Connect = "Server";
}
m_Connect += "has disconnected";
UpdateData(FALSE);
}
void CSocketTestDlg::OnAccept()
...{
m_Connect += "OK!";
UpdateData(FALSE);
m_ClientSocket = new CNewSocket(this->m_hWnd);
m_ServerSocket->Accept(*m_ClientSocket);
}
void CSocketTestDlg::OnReceive()
...{
char *buff = new char[1024];
memset(buff, 0, 1024);
m_ClientSocket->Receive(buff, 1024);
AfxMessageBox(buff);
delete []buff;
UpdateData(FALSE);
}
void CSocketTestDlg::OnServerradio()
...{
UpdateData(TRUE);
GetDlgItem(IDC_IPADDRESS)->EnableWindow(FALSE);
GetDlgItem(IDC_PORTEDIT)->EnableWindow(TRUE);
UpdateData(FALSE);
}
void CSocketTestDlg::OnClientradio()
...{
UpdateData(TRUE);
GetDlgItem(IDC_IPADDRESS)->EnableWindow(TRUE);
GetDlgItem(IDC_PORTEDIT)->EnableWindow(TRUE);
UpdateData(FALSE);
}
使用方法:开启2个应用程序,一个选择Server,点击Connect,一个选择Cleint,点击Connect,然后就可以收发了消息了。如果不是本机测试,就改一下IP和端口。
相关文章推荐
- 使用RxJava自己构造一个三级缓存的实例
- 使用Class 实例化一个对象
- 高级I/O复用技术:Epoll的使用及一个完整的C实例
- 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值
- 使用gtype构造的一个简单学生管理程序其他属性自己加
- JSP中使用JavaBean的一个实例
- 使用互斥体Mutex 实现应用程序只有一个实例运行
- RPG/400 自己写的一个小实例分享!(1)
- LK光流算法中是怎么使用金字塔的(就一个截图,大概明白点就行,毕竟有函数不必自己实现)
- 配置一个适合自己使用习惯的Android studio
- 使用winform自己做一个消息框, 以取代系统提供的MessageBox
- 一个使用Servlet文件实现文件下载的实例
- ADO 实例《创建一个临时数据库 创建一个临时数据表 GridView1绑定内容 以及Dataset_的使用》
- 使用QtSingleApplication,实现应用只启动一个实例
- 使用Promise和async-await实现的一个异步遍历+同步执行任务的实例
- 通过一个实例来学习进程间通信之----共享内存,以及使用信号量来保护
- 一个MyBaits使用实例
- 使用XMLSocket(附加一个实例)
- wish list: 考虑使用nutch给自己的博客做一个全文检索
- Keras 使用自己的数据分类,并使用tensorboard记录的简单实例