📄 netcomputedlg.cpp
字号:
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 + -