![](http://www.cncsk.com/Files/3/2006-4/25/5D4697DEB0FE7C17BF31FAE189D734B2.jpg)
图片借用一下别人的,我的程序是根据这个改的,因为感觉其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
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
class
CNewSocket :
public
CSocket
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
// Attributes
public:
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Operations
public:
CNewSocket(HWND hwnd);
virtual ~CNewSocket();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Overrides
public:
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CNewSocket)
//}}AFX_VIRTUAL
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
virtual void OnClose(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnAccept(int nErrorCode);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Generated message map functions
//{{AFX_MSG(CNewSocket)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
private:
HWND m_hWnd;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// Implementation
protected:
}
;
------------------------------------------------NewSocket.CPP-----------------------------------
CNewSocket::CNewSocket(HWND hwnd)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
m_hWnd = hwnd;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
CNewSocket::
~
CNewSocket()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CNewSocket::OnAccept(
int
nErrorCode)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
AfxMessageBox("OnAccept");
PostMessage(m_hWnd, WM_FD_ACCEPT, 0, 0);
CSocket::OnAccept( nErrorCode );
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CNewSocket::OnReceive(
int
nErrorCode)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
AfxMessageBox("OnReceive");
PostMessage(m_hWnd, WM_FD_RECEIVE, 0, 0);
CSocket::OnReceive( nErrorCode );
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CNewSocket::OnClose(
int
nErrorCode)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
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框
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
{{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)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
//{{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()
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
BOOL CSocketTestDlg::OnInitDialog()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
………………
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);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CSocketTestDlg::OnConnect()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
CString str_Msg;
UpdateData(TRUE);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
if (0 == m_nStatus) //如果为服务器
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (m_ServerSocket != NULL) //服务器Socket是否已经创建
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
m_Connect = "Please disconnect!";
UpdateData(FALSE);
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
m_Connect = "Wait for client...";
UpdateData(FALSE);
if (!AfxSocketInit()) //Socket初始化
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
MessageBox("WindowSocket initial failed!", "Send", MB_ICONSTOP);
return;
}
//将Socket与窗口关联
m_ServerSocket = new CNewSocket(this->m_hWnd);
//如果创建Socket失败则提示,成功则开始监听
if (!m_ServerSocket->Create(m_Port))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
MessageBox("SendSocket Create failed!", "Send", MB_ICONSTOP);
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
m_ServerSocket->Listen();
}
}
}
else if (1 == m_nStatus) //如果为客户端
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (m_ClientSocket != NULL) //判断客户端Socket是否已经创建
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
m_Connect = "Please disconnect!";
UpdateData(FALSE);
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
m_Connect = "Connect to the server...";
UpdateData(FALSE);
if (!AfxSocketInit())
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
MessageBox("WindowSocket initial failed!", "Receive", MB_ICONSTOP);
return;
}
m_ClientSocket = new CNewSocket(this->m_hWnd);;
if(!m_ClientSocket->Create())
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
MessageBox("ReceiveSocket create failed!","Receive",MB_ICONSTOP);
return;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (!m_ClientSocket->Connect(m_IpAddress, m_Port))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
CString strTmp = m_Connect;
SocketReset();
m_Connect = strTmp;
m_Connect += "Error!";
UpdateData(FALSE);
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
m_Connect += "OK!";
}
UpdateData(FALSE);
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
if (-1 == m_nStatus)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
str_Msg = "Please choose the status!";
AfxMessageBox(str_Msg);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CSocketTestDlg::OnDisconnect()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
SocketReset();
m_Connect = "Disconnect!";
UpdateData(FALSE);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CSocketTestDlg::OnSend()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
UpdateData(TRUE);
this->m_ClientSocket->Send(m_OutPut.GetBuffer(0), m_OutPut.GetLength());
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CSocketTestDlg::OnSendclear()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
m_OutPut = "";
UpdateData(FALSE);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CSocketTestDlg::OnReceiveclear()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
m_InPut = "";
UpdateData(FALSE);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CSocketTestDlg::OnExit()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
CDialog::OnOK();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CSocketTestDlg::SocketReset()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if (m_ServerSocket != NULL)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
delete m_ServerSocket;
m_ServerSocket = NULL;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
if (m_ClientSocket != NULL)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
delete m_ClientSocket;
m_ClientSocket = NULL;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
m_Connect = "";
UpdateData(FALSE);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CSocketTestDlg::OnClose()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if (0 == m_nStatus)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
m_Connect = "Client";
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
m_Connect = "Server";
}
m_Connect += "has disconnected";
UpdateData(FALSE);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CSocketTestDlg::OnAccept()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
m_Connect += "OK!";
UpdateData(FALSE);
m_ClientSocket = new CNewSocket(this->m_hWnd);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
m_ServerSocket->Accept(*m_ClientSocket);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CSocketTestDlg::OnReceive()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
char *buff = new char[1024];
memset(buff, 0, 1024);
m_ClientSocket->Receive(buff, 1024);
AfxMessageBox(buff);
delete []buff;
UpdateData(FALSE);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CSocketTestDlg::OnServerradio()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
UpdateData(TRUE);
GetDlgItem(IDC_IPADDRESS)->EnableWindow(FALSE);
GetDlgItem(IDC_PORTEDIT)->EnableWindow(TRUE);
UpdateData(FALSE);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
CSocketTestDlg::OnClientradio()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
UpdateData(TRUE);
GetDlgItem(IDC_IPADDRESS)->EnableWindow(TRUE);
GetDlgItem(IDC_PORTEDIT)->EnableWindow(TRUE);
UpdateData(FALSE);
}
使用方法:开启2个应用程序,一个选择Server,点击Connect,一个选择Cleint,点击Connect,然后就可以收发了消息了。如果不是本机测试,就改一下IP和端口。