#ifndef MFC_SOCKET
#define MFC_SOCKET
#include "afxwin.h"
#include "resource.h"
#include "DigTab_Conn.h"
#include <afxsock.h>
#include "winsock2.h"
#pragma comment(lib,"Ws2_32.lib")
#include <thread>
#include "CdiglogPublic.h"
#include<ctime>
UINT Recv_Th(LPVOID p);
void dumpRecv(const void * buffer, size_t n);
class MfcSocket: public CDialog, public CdiglogPublic{
DECLARE_DYNAMIC(MfcSocket)
public:
MfcSocket(CWnd* pParent = NULL); // 标准构造函数
virtual ~MfcSocket();
virtual BOOL OnInitDialog();
// 对话框数据
enum { IDD = IDD_MFCSOCKET };
private:
CEdit m_EditRecv;
CEdit m_EditSend;
CWinThread*m_recvThread;
CDialog *m_pdlog;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
static UINT Recv_(LPVOID param);
int Connect();
void setDialog(CDialog *pThis);
afx_msg void OnBnClickedMfcConnect();
afx_msg void OnBnClickedMfcSend();
afx_msg void OnBnClickedMfcDisconnect();
afx_msg void OnBnClickedMfcClear();
};
#endif
#include "MfcSocket.h"
#include<iostream>
#define MFC_SOCKET_STOP 0x0FFF
#define SizeLine 32
static CString Recv = "";
SOCKET sockClient;
IMPLEMENT_DYNAMIC(MfcSocket, CDialog)
MfcSocket::MfcSocket(CWnd* pParent /*=NULL*/)
:CDialog(MfcSocket::IDD, pParent)
{
EnableActiveAccessibility();
}
MfcSocket::~MfcSocket(){
}
BOOL MfcSocket::OnInitDialog()
{
CDialog::OnInitDialog();
CButton* pBtn = (CButton*)GetDlgItem(IDC_HEX_MODE);
pBtn->SetCheck(1);
(CButton*)this->GetDlgItem(IDC_MFC_SEND)->EnableWindow(false);
(CButton*)this->GetDlgItem(IDC_MFC_DISCONNECT)->EnableWindow(false);
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
return TRUE;
}
void MfcSocket::DoDataExchange(CDataExchange* pDX){
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_SOCKET_SEND, m_EditSend);
DDX_Control(pDX, IDC_SOCKET_RECV, m_EditRecv);
}
//添加消息映射
BEGIN_MESSAGE_MAP(MfcSocket, CDialog)
ON_BN_CLICKED(IDC_MFC_CONNECT, &MfcSocket::OnBnClickedMfcConnect)
ON_BN_CLICKED(IDC_MFC_SEND, &MfcSocket::OnBnClickedMfcSend)
ON_BN_CLICKED(IDC_MFC_DISCONNECT, &MfcSocket::OnBnClickedMfcDisconnect)
ON_BN_CLICKED(IDC_MFC_CLEAR, &MfcSocket::OnBnClickedMfcClear)
END_MESSAGE_MAP()
int MfcSocket::Connect()
{
WSADATA wsaData;
SOCKADDR_IN addrSrv;
WORD wVersion;
CString strIP, strPort,title;
int i = -1;
m_pdlog->GetDlgItemText(IDC_IPADDRESS, strIP);
m_pdlog->GetDlgItemText(IDC_PORT, strPort);
wVersion = MAKEWORD(1, 1);
if(WSAStartup(wVersion, &wsaData)){
MessageBox("WSAStartup error !");
return -1;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion) != 1 ){
MessageBox("LOBYTE error !");
WSACleanup();
return -2;
}
if ((sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){
MessageBox("create socket error !");
WSACleanup();
return -3;
}
//addrSrv.sin_addr.s_addr = inet_addr("172.16.32.11");
addrSrv.sin_addr.s_addr = inet_addr(strIP.GetBuffer(0));
if(INADDR_NONE == addrSrv.sin_addr.s_addr){
MessageBox("addr invailed !");
WSACleanup();
return -4;
}
addrSrv.sin_family = AF_INET;
//addrSrv.sin_port = htons(1235);
addrSrv.sin_port = htons(atoi(strPort));
if (connect(sockClient, (struct sockaddr *)&addrSrv, sizeof(SOCKADDR_IN)) == SOCKET_ERROR){
MessageBox("connected error !");
WSACleanup();
return -5;
}else{
MessageBox("connected ok !");
m_recvThread = AfxBeginThread((AFX_THREADPROC)Recv_, this);
}
return 0;
}
UINT MfcSocket::Recv_(LPVOID param){
char msg[1024] = {'\0'};
int res = 0;
MfcSocket * dlg = (MfcSocket*)param;
while (1){
#if 1
MSG Mssage;
if(PeekMessage(&Mssage, NULL, 0, 0, PM_REMOVE)){
if(Mssage.message == MFC_SOCKET_STOP){
return 0;
}else{
DispatchMessage(&Mssage);
}
}
#endif
if ((res = recv(sockClient, msg, 1024, 0)) == -1){
dlg->MessageBox("socket closed !");
break;
} else {
if(res > 2){
dlg->MessageBox("recv msg ok!");
msg[res] = '\0';
dumpRecv(msg, res);
dlg->SetDlgItemText(IDC_SOCKET_RECV, Recv);
}
}
}
}
void MfcSocket::setDialog(CDialog *pThis){
m_pdlog = pThis;
}
void MfcSocket::OnBnClickedMfcSend()
{
// TODO: 在此添加控件通知处理程序代码
CString cstr;
//char * msg;
m_EditSend.GetWindowText(cstr);
std::string str = cstr.GetBuffer();
if(!str.length()){
MessageBox("message is null !");
return;
}
char pData[MAX_SIZE]={'\0'};
Asc2Bcd((const uchar*)str.c_str(), str.length(), (uchar*)pData);
if (send(sockClient, pData, str.length()/2, 0) == SOCKET_ERROR){
MessageBox("send massage error !");
return;
}
else{
MessageBox("send massage ok !");
}
}
#if 1
void dumpRecv(const void * buffer, size_t n)
{
Recv = "";
char textBuffer[SizeLine * 3 + 6 + SizeLine + 1];
const char * pSrc = reinterpret_cast<const char *>(buffer);
size_t i;
while (n)
{
const char * p = pSrc;
char * pHex = &textBuffer[0];
char * pAscii = &textBuffer[SizeLine * 3 + 6];
for (i = 0; i < n && i < SizeLine; ++i, ++p)
{
sprintf_s(pHex, sizeof(textBuffer)-i * 3, " %02X ", (unsigned int)(*p & 0x00FF));
pHex += 3;
unsigned char ch = *p;
if (ch < 0x20 || ch >= 0x7F)
{
ch = '.';
}
*pAscii++ = ch;
}
pSrc += i;
n -= i;
#if 1
while (i++ < SizeLine)
{
sprintf_s(pHex, sizeof(textBuffer)-i * 3, " ");
pHex += 3;
*pAscii++ = ' ';
}
#endif
*pHex++ = ' ';
*pHex++ = ' ';
*pHex++ = ' ';
*pHex++ = ' ';
*pHex++ = ' ';
*pHex++ = ' ';
*pAscii = '\0';
Recv += textBuffer;
Recv += "\r\n";
}
Recv += "\r\n";
//strDataRecv += "\r\n";
}
#endif
void MfcSocket::OnBnClickedMfcConnect()
{
// TODO: 在此添加控件通知处理程序代码
if(0 != Connect())return;
(CButton*)this->GetDlgItem(IDC_MFC_SEND)->EnableWindow(true);
(CButton*)this->GetDlgItem(IDC_MFC_CONNECT)->EnableWindow(false);
(CButton*)this->GetDlgItem(IDC_MFC_DISCONNECT)->EnableWindow(true);
}
void MfcSocket::OnBnClickedMfcDisconnect()
{
// TODO: 在此添加控件通知处理程序代码
m_recvThread->PostThreadMessage(MFC_SOCKET_STOP, NULL, NULL);
closesocket(sockClient);
WSACleanup();
(CButton*)this->GetDlgItem(IDC_MFC_CONNECT)->EnableWindow(true);
(CButton*)this->GetDlgItem(IDC_MFC_SEND)->EnableWindow(false);
(CButton*)this->GetDlgItem(IDC_MFC_DISCONNECT)->EnableWindow(false);
}
void MfcSocket::OnBnClickedMfcClear()
{
// TODO: 在此添加控件通知处理程序代码
SetDlgItemText(IDC_SOCKET_SEND, "");
SetDlgItemText(IDC_SOCKET_RECV, "");
Recv = "";
}