?? 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)) //創(chuàng)建一個監(jiān)聽套接字
{
m_state="服務啟動";
SocketListen.Bind(m_port,m_ip); //給套接字指定一個本地IP地址和協(xié)議端口
SocketListen.Listen(5); //監(jiān)聽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(); //創(chuàng)建客戶端數據收發(fā)套接字
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 + -