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

📄 tcpdlg.cpp

📁 OA系统权限管理设计任何系统都离不开权限的管理,有一个好的权限管理模块,不仅使我们的系统操作自如,管理方便,也为系统添加亮点
💻 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 + -