自己写的一个使用CSocket的实例

图片借用一下别人的,我的程序是根据这个改的,因为感觉其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, 
00);
    CSocket::OnAccept( nErrorCode );
}


void  CNewSocket::OnReceive( int  nErrorCode)
{
    AfxMessageBox(
"OnReceive");
    PostMessage(m_hWnd, WM_FD_RECEIVE, 
00);
    
    CSocket::OnReceive( nErrorCode );
}


void  CNewSocket::OnClose( int  nErrorCode)
{

    PostMessage(m_hWnd, WM_FD_CLOSE, 
00);
    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, 
01024);
    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和端口。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值