⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 talktcpdlg.cpp

📁 基于EVC的wince下的TCP消息收发程序
💻 CPP
字号:
// TalkTCPDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TalkTCP.h"
#include "TalkTCPDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define INDICATOR 2


//和通信线城相关的全局变量
CWinThread	*pThreadSendMsg; //发送消息线程
CWinThread	*pThreadLisen; //监听线程-->_ListenTcpThread

//TCP监听线程
UINT _ListenTcpThread(LPVOID lparam)
{
	CTalkTCPDlg *pDlg=(CTalkTCPDlg *)lparam;
	//接受连接并取得对方IP	
	int acceptSucceed=pDlg->sockSrvr.Accept(pDlg->recSo,(SOCKADDR *)&(pDlg->client),&(pDlg->iAddrSize));
	if(acceptSucceed==0)
	{
		AfxMessageBox(_T("接收错误!"));
		pDlg->Busy1=FALSE;
		return 0;
	}
	pDlg->Listened=TRUE;
	return 0;	
}

//TCP发送信息线程
UINT _SendMsgThread(LPVOID lparam)
{	
	CTalkTCPDlg *pDlg=(CTalkTCPDlg *)lparam;
	
	
	CString ip,strError;
	ip=pDlg->m_strIPRemote;
	int conn=pDlg->sockClient.Connect(ip,pDlg->m_nPortRemote);
	if(conn==0)
	{
		AfxMessageBox(_T("建立连接错误!"));
		pDlg->sockClient.ShutDown(2);
		pDlg->Busy=FALSE;
		return 0;		
	}
	//首先发送标记M为信息,2
	int end=0;
	end=pDlg->sockClient.Send("M",INDICATOR); 
	if(end==SOCKET_ERROR)
	{
		AfxMessageBox(_T("发送标记错误!"));
		return -1;
	}
	else if(end!=2)
	{
		AfxMessageBox(_T("消息头错误"));
		return -1;
	}
	char *datasend;
	int i;
	datasend=new char[pDlg->m_strSend.GetLength()];
	for(i=0;i<pDlg->m_strSend.GetLength();i++)
	{
		datasend[i]=pDlg->m_strSend[i];
	}
	end=pDlg->sockClient.Send(datasend,pDlg->m_strSend.GetLength());
	delete datasend;
	if(end==SOCKET_ERROR)
	{
		AfxMessageBox(_T("发送消息错误!"));
		return -1;
	}
	pDlg->Busy=FALSE;

	return 0;
}


/////////////////////////////////////////////////////////////////////////////
// CTalkTCPDlg dialog

CTalkTCPDlg::CTalkTCPDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTalkTCPDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTalkTCPDlg)
	m_strIPLocal = _T("");
	m_strIPRemote = _T("");
	m_strMessage = _T("");
	m_strSend = _T("");
	m_nPortLocal = 0;
	m_nPortRemote = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTalkTCPDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTalkTCPDlg)
	DDX_Control(pDX, IDC_EDIT_MESSAGE, m_CtrlMessage);
	DDX_Text(pDX, IDC_EDIT_IPADDRESS_LOCAL, m_strIPLocal);
	DDX_Text(pDX, IDC_EDIT_IPADDRESS_REMOTE, m_strIPRemote);
	DDX_Text(pDX, IDC_EDIT_MESSAGE, m_strMessage);
	DDX_Text(pDX, IDC_EDIT_SEND, m_strSend);
	DDX_Text(pDX, IDC_EDIT_PORT_LOCAL, m_nPortLocal);
	DDV_MinMaxInt(pDX, m_nPortLocal, 0, 65535);
	DDX_Text(pDX, IDC_EDIT_PORT_REMOTE, m_nPortRemote);
	DDV_MinMaxInt(pDX, m_nPortRemote, 0, 65535);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTalkTCPDlg, CDialog)
	//{{AFX_MSG_MAP(CTalkTCPDlg)
	ON_BN_CLICKED(IDC_LISTEN, OnListen)
	ON_BN_CLICKED(IDC_SEND_MESSAGE, OnSendMessage)
	ON_BN_CLICKED(IDC_CLEAR_MESSAGE, OnClearMessage)
	ON_WM_DESTROY()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTalkTCPDlg message handlers

BOOL CTalkTCPDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

	// TODO: Add extra initialization here
	//1.设置默认端口值
	m_nPortLocal=13400;
	m_nPortRemote=13400;

	//2.获取本机计算机名称
	GetLocalHostName(m_strLocalName);
	//3.获取本机IP
	GetIpAddress(m_strLocalName,m_strIPLocal);
	//SetDlgItemText(IDC_EDIT_IPADDRESS_LOCAL,m_strIPLocal);

	//4.默认的对方IP和本机相同
	m_strIPRemote=m_strIPLocal;
	//SetDlgItemText(IDC_EDIT_IPADDRESS_REMOTE,m_strIPRemote);

	//5.默认为不接收
	Receive=FALSE;
	Busy=FALSE;


	UpdateData(FALSE);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

int CTalkTCPDlg::GetLocalHostName(CString &sLocalName)	//获得本地计算机名称
{
	char szLocalName[256];
	int nRetCode;
	nRetCode=gethostname(szLocalName,sizeof(szLocalName));
	if(nRetCode!=0)
	{
		//产生错误
		sLocalName=_T("没有取得");
		return GetLastError();
	}
	sLocalName=szLocalName;
	return 0;
}

int CTalkTCPDlg::GetIpAddress(const CString &sLocalName, CString &sIpAddress)//获得本地IP
{
	char szLocalName[256];
	int i;
	for(i=0;i<256;i++)
	{
		szLocalName[i]=0;
	}
	for(i=0;i<sLocalName.GetLength();i++)
	{
		szLocalName[i]=sLocalName[i];
	}
	struct hostent FAR * lpHostEnt=gethostbyname(szLocalName);
	if(lpHostEnt==NULL)
	{
		//产生错误
		sIpAddress=_T("");
		return GetLastError();
	}
	//获取IP
	LPSTR lpAddr=lpHostEnt->h_addr_list[0];
	if(lpAddr)
	{
		struct in_addr inAddr;
		memmove(&inAddr,lpAddr,4);
		//转换为标准格式
		sIpAddress=inet_ntoa(inAddr);
		if(sIpAddress.IsEmpty())
		{
			sIpAddress=_T("没有取得");
		}
	}
	return 0;
}
int CTalkTCPDlg::GetNamebyAddress(const CString &IpAddress,CString &sRemoteName)//获得对方计算机名称
{
	char RemoteName[256];
	int i;
	unsigned long addr;
	for(i=0;i<256;i++)
	{
		RemoteName[i]=0;
	}
	for(i=0;i<IpAddress.GetLength();i++)
	{
		RemoteName[i]=IpAddress[i];
	}
	addr=inet_addr(RemoteName);
	struct hostent FAR * lpHostEnt=gethostbyaddr((char *)&addr,4,AF_INET);
	if(lpHostEnt==NULL)
	{
		//产生错误
		sRemoteName=_T("");

		AfxMessageBox(_T("连接不上"));
		return -1;
	}
	CString name=lpHostEnt->h_name;
	sRemoteName=name;
	return 0;
}

int CTalkTCPDlg::ProcessReceivedMessage() //处理收到消息的函数
{
	if(m_datatype=='M')	//文本信息
	{
		char *buff;
		int i;
		buff=new char[1024];
		for(i=0;i<1024;i++)
		{
			buff[i]=0;
		}
		CString msg;
		int ret=0;
		for(;;)
		{
			ret=recSo.Receive(buff,1024);
			if(ret==0)
			{
				break;
			}
			msg+=CString(buff);
		}
		delete buff;

		//更新显示		
		CString MessageRemoteName;
		GetNamebyAddress(m_strIPRemote,MessageRemoteName);
		m_strMessage+=MessageRemoteName+":"+"\r\n"+msg+"\r\n"+"\r\n";
		SetDlgItemText(IDC_EDIT_MESSAGE,m_strMessage);
		m_CtrlMessage.SetSel(m_strMessage.GetLength(),m_strMessage.GetLength(),FALSE);
	}
	recSo.Close();
	Busy1=FALSE;
	return 0;
}



void CTalkTCPDlg::OnListen() 
{
	m_nPortRemote=GetDlgItemInt(IDC_EDIT_PORT_REMOTE,NULL,TRUE);
	m_nPortLocal=GetDlgItemInt(IDC_EDIT_PORT_LOCAL,NULL,TRUE);
	GetDlgItemText(IDC_EDIT_IPADDRESS_REMOTE,m_strIPRemote);
	GetDlgItemText(IDC_EDIT_SEND,m_strSend);
	UpdateData(FALSE);
	if(!Receive)
	{
		//开始监听
		Receive=TRUE;
		Busy1=FALSE;
		m_timer=SetTimer(1,10,NULL);
		SetDlgItemText(IDC_LISTEN,_T("不接收"));
	}
	else
	{
		//停止监听
		CSocket sockClientClose;
		sockClientClose.Create();
		CString ip,strError;
		ip="127.0.0.1";
		int conn=sockClientClose.Connect(ip, m_nPortLocal);
		if(conn==0)	///////////////////////////////////
		{
			AfxMessageBox(_T("关闭错误!"));
			sockClientClose.ShutDown(2);
			sockClientClose.Close();
			Receive=FALSE;		
			KillTimer(m_timer);
			return;					
		}
		sockClientClose.Send("D",INDICATOR); //结束
		//Receive=FALSE;		
		//KillTimer(m_timer);
		SetDlgItemText(IDC_LISTEN,_T("接收"));		
	}
}

void CTalkTCPDlg::OnSendMessage() 
{
	m_nPortRemote=GetDlgItemInt(IDC_EDIT_PORT_REMOTE,NULL,TRUE);
	GetDlgItemText(IDC_EDIT_SEND,m_strSend);
	GetDlgItemText(IDC_EDIT_IPADDRESS_REMOTE,m_strIPRemote);
	UpdateData(false);
	if(m_strSend.GetLength()==0)
	{
		return;
	}
	sockClient.Create();
	Busy=TRUE;
	::AfxBeginThread(_SendMsgThread,this);
	while(Busy)
	{
		Sleep(1);
	}
	sockClient.Close();

	//更新显示
	m_strMessage+=m_strLocalName+":"+"\r\n"+m_strSend+"\r\n"+"\r\n";
	SetDlgItemText(IDC_EDIT_MESSAGE,m_strMessage);
	m_CtrlMessage.SetSel(m_strMessage.GetLength(),m_strMessage.GetLength(),FALSE);
}

void CTalkTCPDlg::OnClearMessage() 
{
	GetDlgItemText(IDC_EDIT_SEND,m_strSend);
	m_strMessage.Empty();
	UpdateData(false);
}

void CTalkTCPDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	if(Receive)
	{
		//停止监听
	}
	
}

void CTalkTCPDlg::OnTimer(UINT nIDEvent) 
{
	if(Receive&&!Busy1)
	{
		Busy1=TRUE;
		createSucceed=sockSrvr.Create(m_nPortLocal);
		if(createSucceed==0)
		{
			AfxMessageBox(_T("建立Socket错误!"));
			Busy1=FALSE;
			return;
		}

		//开始监听	
		int listenSucceed=sockSrvr.Listen();
		if(listenSucceed==0)
		{
			AfxMessageBox(_T("监听错误!"));
			Busy1=FALSE;
			return;
		}		
		
		iAddrSize=sizeof(client);

		Listened=FALSE;
		::AfxBeginThread(_ListenTcpThread,this);
		
	}
	if(Listened)
	{
		sockSrvr.Close();
		char Indicator[INDICATOR]={0};		
		if(recSo.Receive(Indicator,INDICATOR)!=2) 
		{
			Busy1=FALSE;
			return;	
		}
		m_datatype=Indicator[0];
		if(m_datatype=='D')
		{
			Busy1=FALSE;
			Receive=FALSE;
			KillTimer(m_timer);
			return;
		}		
		ProcessReceivedMessage();
	}
	CDialog::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -