📄 tcpdlg.cpp
字号:
// TCPdlg.cpp : implementation file
//
#include "stdAfx.h"
#include "通信.h"
#include "TCPdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTCPdlg dialog
CTCPdlg::CTCPdlg(CWnd* pParent /*=NULL*/)
: CDialog(CTCPdlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTCPdlg)
m_ip = _T("");
m_port = 0;
m_sendmsg = _T("");
m_state = _T("");
//}}AFX_DATA_INIT
m_bStarting=FALSE;
m_bConnected=FALSE;
m_WorkType = -1;
}
void CTCPdlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTCPdlg)
DDX_Control(pDX, IDC_LIST, m_list);
DDX_Text(pDX, IDC_IP, m_ip);
DDX_Text(pDX, IDC_PORT, m_port);
DDX_Text(pDX, IDC_SEND_MSG, m_sendmsg);
DDX_Text(pDX, IDC_STATE, m_state);
DDX_Radio(pDX, IDC_RADIO1, m_WorkType);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTCPdlg, CDialog)
//{{AFX_MSG_MAP(CTCPdlg)
ON_BN_CLICKED(IDC_START_SERVER, OnStartServer)
ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
ON_BN_CLICKED(IDC_CLOSE_SERVER, OnCloseServer)
ON_BN_CLICKED(IDC_SEND, OnSend)
//}}AFX_MSG_MAP
ON_MESSAGE(ACCEPT_EVENT,OnEvent)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTCPdlg message handlers
void CTCPdlg::OnStartServer()
{
// TODO: Add your control notification handler code here
if(m_WorkType==0) //服务器
{
if(!m_bStarting)
{
UpdateData(TRUE); //得到控件变量
if(m_port==0) //如果端口未设置,请先设置端口号
{
MessageBox("请输入端口号");
return;
}
if(SocketListen.Create(m_port,SOCK_STREAM,m_ip)) //创建一个监听套接字
{
m_state="服务启动";
SocketListen.Bind(m_port,m_ip); //给套接字指定一个本地IP地址和协议端口
SocketListen.Listen(5); //监听bind指定的端口
WSAAsyncSelect(SocketListen,GetSafeHwnd(),ACCEPT_EVENT,FD_ACCEPT|FD_READ|FD_CLOSE);
m_bStarting=TRUE;
}
}
}
else
if(m_WorkType==1) // 客户机
{
if(!m_bConnected) //未与服务器连接
{
CString str;
UpdateData(TRUE);
if(m_port==0||m_ip=="") //如果未输入服务器IP和端口号
{
MessageBox("请输入Ip地址和端口号");
return ;
}
m_tcpsock.Create(); //创建客户端数据收发套接字
if(BOOL fC=m_tcpsock.Connect(m_ip,m_port)) //与服务器连接
{
WSAAsyncSelect(m_tcpsock,GetSafeHwnd(),ACCEPT_EVENT,FD_READ|FD_CLOSE);
m_bConnected=TRUE;
m_state="与服务器连接";
}
else //如连接失败
{m_tcpsock.Close();
m_state="连接失败";
}
}
}
else //未选择客户机?服务器
MessageBox("请选择通信地位(客户机?服务器)");
UpdateData(FALSE); //更新显示
}
void CTCPdlg::OnRadio1()
{
// TODO: Add your control notification handler code here
m_WorkType=0; //服务器
SetDlgItemText(IDC_START_SERVER,"启动服务器");
SetDlgItemText(IDC_CLOSE_SERVER,"关闭服务器");
GetDlgItem(IDC_IP)->EnableWindow(FALSE); //使IP地址只读
m_ip=GetIP(); //得到本机Ip地址
UpdateData(FALSE);
}
void CTCPdlg::OnRadio2()
{
// TODO: Add your control notification handler code here
m_WorkType=1;
SetDlgItemText(IDC_START_SERVER,"连接");
SetDlgItemText(IDC_CLOSE_SERVER,"断开");
GetDlgItem(IDC_IP)->EnableWindow(TRUE); //使IP地址可编辑
}
void CTCPdlg::OnCloseServer()
{
// TODO: Add your control notification handler code here
if(m_bConnected)
{
m_tcpsock.ShutDown(2);
m_tcpsock.Close();
m_bConnected=FALSE;
WSAAsyncSelect(m_tcpsock,GetSafeHwnd(),0,0);
}
if(m_WorkType==0)
{
m_state="停止服务";
SocketListen.Close();
}
if(m_WorkType==1)
m_state="断开";
UpdateData(FALSE);
}
void CTCPdlg::OnSend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
int iSend=m_tcpsock.Send(m_sendmsg,40,0);
TRACE("sent%d byte\n",iSend);
}
CString CTCPdlg::GetIP()
{
WORD wVersionRequested;
WSADATA wsaData;
char name[255]; // 本地主机名字符数组变量
CString m_ip; // IP地址字符串变量
PHOSTENT hostinfo; // hostent结构指针
wVersionRequested=MAKEWORD(2,0); //连接应用程序与winsock Dll
if(WSAStartup(wVersionRequested,&wsaData)==0)
{
if(gethostname(name,sizeof(name))==0) //得到本地主机名
{ if((hostinfo=gethostbyname(name))!=NULL) //得到主机信息
{ m_ip=inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list); //转换得到IP地址
}
else m_ip="IP检测失败";
}
WSACleanup(); // 中止winsock DLL的使用
}
return m_ip; //返回IP地址字符串
}
void CTCPdlg::OnEvent(WPARAM wParam, LPARAM lParam)
{
switch(lParam)
{
case FD_ACCEPT:
{
if(!m_bConnected) //如未连接
{
SocketListen.Accept(m_tcpsock);
m_bConnected=TRUE;
m_state="连接";
}
break;
}
case FD_READ: //欲接收读准备好的通知
{
char szRecv[50];
CString rstr;
int iRecv=m_tcpsock.Receive(szRecv,40,0); //接收TCP数据
TRACE("received %d byte\n",iRecv);
if(iRecv>=0)
{
szRecv[iRecv]='\0';
rstr=szRecv;
m_state="收到数据";
m_list.AddString(rstr); //在列表框中加入接收到的字符串
}
break;
}
case FD_CLOSE:
if(m_WorkType==0)
m_state="客户端断开";
if(m_WorkType==1)
m_state="服务器端停止服务";
m_bConnected=FALSE;
m_tcpsock.Close(); //关闭socket
break;
}
UpdateData(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -