📄 talktcpdlg.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 + -