MFCSocket

#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 = "";
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值