您的位置:首页 > 其它

自己写的一个使用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和端口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: