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

📄 netcomputedlg.cpp

📁 本程序是用winsock API函数编写网络部分
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			m_lcContent.InsertItem(0,_T("成功创建套接字!"));
			CString str;
			m_ipCtl.GetWindowText(str);
			m_serveraddr.sin_family=AF_INET; 
			m_serveraddr.sin_port = htons(port);
			m_serveraddr.sin_addr.S_un.S_addr = inet_addr(str);
			//注册网络事件
			WSAAsyncSelect(m_serverSocket, m_hWnd, CLIENT_UDP_EVENT, FD_READ);

			if(bind(m_serverSocket,(const sockaddr*)&m_serveraddr,sizeof(m_serveraddr)) == SOCKET_ERROR)
			{
				m_lcContent.InsertItem(0,_T("客户端绑定失败!"));
				return;
			}
			m_lcContent.InsertItem(0,_T("客户端成功绑定!"));



		}
		GetDlgItem(IDC_DATA1)->EnableWindow();
		GetDlgItem(IDC_DATA2)->EnableWindow();
		GetDlgItem(IDC_SEND)->EnableWindow();
	}
	GetDlgItem(IDC_START)->EnableWindow(FALSE);
	GetDlgItem(IDC_CLOSE)->EnableWindow();
	GetDlgItem(IDC_IPCTL)->EnableWindow(FALSE);
	GetDlgItem(IDC_TCP)->EnableWindow(FALSE);
	GetDlgItem(IDC_UDP)->EnableWindow(FALSE);
	GetDlgItem(IDC_SERVER)->EnableWindow(FALSE);
	GetDlgItem(IDC_CLIENT)->EnableWindow(FALSE);

}

//定义服务器端网络响应函数(TCP协议)
void CNetComputeDlg::OnServerTCPEvent(WPARAM wParam, LPARAM lParam)
{
	//调用API函数,得到网络事件类型
	int iEvent = WSAGETSELECTEVENT(lParam);
	switch(iEvent)
	{
		//客户连接
	case FD_ACCEPT :
		{
			int len = sizeof(sockaddr);
			m_clientSocket = accept(m_serverSocket, (struct sockaddr * )&m_clientaddr, &len);
			if (m_clientSocket == INVALID_SOCKET)
			{
				m_lcContent.InsertItem(0,_T("客户登录失败!"));
			}
			m_lcContent.InsertItem(0,_T("客户已登陆,服务中。。。"));
			break;
		}
		//读取数据
	case FD_READ :
		{
			OnServerRecvMessage(m_clientSocket);
			break;
		}
		//客户退出
	case FD_CLOSE :
		{
			closesocket(m_clientSocket);
			m_lcContent.InsertItem(0,_T("用户离开!"));
			break;
		}
	default :
		break;
	}
}

//处理网络数据包到达事件
void CNetComputeDlg::OnServerRecvMessage(SOCKET pSocket)
{
	char strBuf[32];
	for (int i = 0; i < 32; i++)
		strBuf[i] = '\0';
	if (m_protocolType == 0)
		recv(pSocket, strBuf, 32, 0);
	else
		recvfrom(pSocket, strBuf, 32, 0, (struct sockaddr *)&m_serveraddr, (int*)sizeof(sockaddr));
//	m_lcContent.InsertItem(0,_T("收到用户数据:"));
//	m_lcContent.InsertItem(0,strBuf);
	CString strReturn = DealClientMessage(strBuf);
	if (m_protocolType == 0)
		send(pSocket, strReturn, strReturn.GetLength(), 0);
	else
		sendto(pSocket, strReturn, strReturn.GetLength(), 0, (struct sockaddr *)&m_serveraddr, sizeof(sockaddr));
	m_lcContent.InsertItem(0,_T("向用户发送数据:"));
	m_lcContent.InsertItem(0,strReturn);
}

//定义服务器端网络响应函数(UDP协议)
void CNetComputeDlg::OnServerUDPEvent(WPARAM wParam, LPARAM lParam)
{
	int iEvent = WSAGETSELECTEVENT(lParam);
	if (iEvent == FD_READ)
	{
		//读取数据
		OnServerRecvMessage(m_serverSocket);
	}

}

//服务器端处理客户端数据函数
CString CNetComputeDlg::DealClientMessage(CString str)
{
	CString strResult = _T("");;
	CString strData1 = _T(""), strData2 = _T("");
	double dData1, dData2, addResult, subResult, multiResult, divResult;
	int iPos = str.Find('#');
	strData1 = str.Left(iPos);
	strData2 = str.Right(str.GetLength() - iPos - 1);
	m_lcContent.InsertItem(0,_T("收到用户数据:"));
	m_lcContent.InsertItem(0,str);
	dData1 = atof(strData1);
	dData2 = atof(strData2);
	addResult = dData1 + dData2;
	subResult = dData1 - dData2;
	multiResult = dData1 * dData2;

	if (dData2 == 0.000000e+000)
	{
		strResult.Format("%s + %s = %e#%s - %s = %e#%s * %s = %e#0.000000e+000 / 0.000000e+000 = Error", strData1, strData2, addResult, strData1, strData2, subResult, strData1, strData2, multiResult);
	}
	else
	{
		divResult = dData1 / dData2;
		strResult.Format("%s + %s = %e#%s - %s = %e#%s * %s = %e#%s / %s = %e", strData1, strData2, addResult, strData1, strData2, subResult, strData1, strData2, multiResult, strData1, strData2, divResult);
	}
	return strResult;
}

/////////////////////////////////////////////////////////////////////
//定义客户端网络响应函数(TCP协议)
void CNetComputeDlg::OnClientTCPEvent(WPARAM wParam, LPARAM lParam)
{
	int iEvent = WSAGETSELECTEVENT(lParam);
	if (iEvent = FD_READ)
	{
		UpdateData();
		char strBuf[200];
		for (int i = 0; i < 200; i++)
			strBuf[i] = '\0';
		if (m_protocolType == 0)
			recv(m_serverSocket, strBuf, 200, 0);
		else
			recvfrom(m_serverSocket, strBuf, 200, 0, (struct sockaddr *)&m_serveraddr, (int*)sizeof(sockaddr));
		CString strReceive;
		strReceive.Format("%s", strBuf);
		m_lcContent.InsertItem(0,_T("收到服务器数据:"));
		m_lcContent.InsertItem(0,strReceive);
		m_lcContent.InsertItem(0,_T("运算结果为:"));
		CString strResult;
		int iLPos = 0 , iRPos;
		iRPos = strReceive.Find("#");
		strResult = strReceive.Left(iRPos );
		m_lcContent.InsertItem(0,strResult);
		iLPos = iRPos;
		strResult.Empty();
		iRPos = strReceive.Find("#", iLPos + 1);
		strResult = strReceive.Mid(iLPos +1, iRPos - iLPos - 1);
		m_lcContent.InsertItem(0,strResult);
		iLPos = iRPos;
		strResult.Empty();
		iRPos = strReceive.Find("#", iLPos + 1);
		strResult = strReceive.Mid(iLPos +1, iRPos - iLPos - 1);
		m_lcContent.InsertItem(0,strResult);
		strResult.Empty();
		strResult = strReceive.Right(strReceive.GetLength() - iRPos - 1);
		m_lcContent.InsertItem(0,strResult);
	}
}

//定义客户端网络响应函数(UDP协议)
void CNetComputeDlg::OnClientUDPEvent(WPARAM wParam, LPARAM lParam)
{
	//调用API函数,得到网络事件类型
	int iEvent = WSAGETSELECTEVENT(lParam);
	switch(iEvent)
	{
		//读取信息
	case FD_READ :
		{
			OnClientTCPEvent(wParam, lParam);
			break;
		}
	default :
		break;
	}

}  


///////////////////////////////////////////////////////////////////
//普通响应函数
//得到本地机名称
int CNetComputeDlg::GetLocalHostName(CString &sHostName)
{
	char szHostName[256];
	int nRetCode;
	nRetCode=gethostname(szHostName,sizeof(szHostName));
	if(nRetCode!=0)
	{
		//产生错误
		sHostName=_T("没有取得");
		return GetLastError();
	}
	sHostName=szHostName;
	return 0;	
}

//得到本地机IP地址
int CNetComputeDlg::GetIpAddress(const CString &sHostName, CString &sIpAddress)
{
	struct hostent FAR * lpHostEnt=gethostbyname(sHostName);
	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;
}

void CNetComputeDlg::OnSend()
{
	UpdateData();
	CString strBuf;
	strBuf.Format("%e#%e", m_dData1, m_dData2);
	//TCP协议发送
	if (m_protocolType == 0)
	{
		send(m_serverSocket, strBuf, strBuf.GetLength(), 0);
	}
	//UDP协议发送
	else
	{
		sendto(m_serverSocket, strBuf, strBuf.GetLength(), 0,(struct sockaddr*) &m_serveraddr, sizeof(m_serveraddr));
	}
	m_lcContent.InsertItem(0,_T("向服务器发送数据:"));
	m_lcContent.InsertItem(0,strBuf);

}

void CNetComputeDlg::OnReset()
{
	m_lcContent.DeleteAllItems();
}

void CNetComputeDlg::OnTCP()
{
	UpdateData();
	CString str;
	if (m_serverType == 0)
	{
		str = _T("TCP协议服务器端------你好!") + m_strLocalName;
	}
	else
	{
		str = _T("TCP协议客户端------你好!") + m_strLocalName;
	}
	SetWindowText(str);

}

void CNetComputeDlg::OnUDP()
{
	UpdateData();
	CString str;
	if (m_serverType == 0)
	{
		str = _T("UDP协议服务器端------你好!") + m_strLocalName;
	}
	else
	{
		str = _T("UDP协议客户端------你好!") + m_strLocalName;
	}
	SetWindowText(str);
}

void CNetComputeDlg::OnServer()
{
	UpdateData();
	CString str;
	if (m_protocolType == 0)
	{
		str = _T("TCP协议服务器端------你好!") + m_strLocalName;
	}
	else
	{
		str = _T("UDP协议服务器端------你好!") + m_strLocalName;
	}
	SetWindowText(str);
}

void CNetComputeDlg::OnClient()
{	
	UpdateData();
	CString str;
	if (m_protocolType == 0)
	{
		str = _T("TCP协议客户端------你好!") + m_strLocalName;
	}
	else
	{
		str = _T("UDP协议客户端------你好!") + m_strLocalName;
	}
	SetWindowText(str);
}

void CNetComputeDlg::OnClose()
{
	closesocket(m_serverSocket);
	WSACleanup();
	m_lcContent.InsertItem(0, _T("成功关闭套接字!"));
	GetDlgItem(IDC_TCP)->EnableWindow();
	GetDlgItem(IDC_UDP)->EnableWindow();
	GetDlgItem(IDC_SERVER)->EnableWindow();
	GetDlgItem(IDC_CLIENT)->EnableWindow();
	GetDlgItem(IDC_IPCTL)->EnableWindow();
	GetDlgItem(IDC_START)->EnableWindow();
	GetDlgItem(IDC_CLOSE)->EnableWindow(FALSE);
	GetDlgItem(IDC_DATA1)->EnableWindow(FALSE);
	GetDlgItem(IDC_DATA2)->EnableWindow(FALSE);
	GetDlgItem(IDC_SEND)->EnableWindow(FALSE);

}

void CNetComputeDlg::OnCancel()
{
	closesocket(m_serverSocket);
	closesocket(m_clientSocket);
	WSACleanup();
	CDialog::OnCancel();
}

⌨️ 快捷键说明

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