📄 simplemessagerdlg.cpp
字号:
CString text = "你的IP是 : " + hostip;
m_hostip = hostip;
AddNewMessage("本地", text);
this->SetWindowText(text);
}
}
//创建套接字
m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(m_socket<0)
{
int err = WSAGetLastError();
CString text = "套接字创建失败!";
CString errCode;
errCode.Format(" ErrCode = %d", WSAGetLastError());
AddNewMessage("本地", text + errCode);
KillTimer(10000);
m_SendButton.EnableWindow(FALSE);
}
else
{
AddNewMessage("本地", "套接字创建成功!");
}
//转换套接字为nonblocking 模式
int mode = 1;
result = ioctlsocket(m_socket, FIONBIO, (u_long FAR*)&mode);
if(result)
{
int err = WSAGetLastError();
CString text = "转换非阻塞模式失败!";
CString errCode;
errCode.Format(" ErrCode = %d", WSAGetLastError());
AddNewMessage("本地", text + errCode);
KillTimer(10000);
m_SendButton.EnableWindow(FALSE);
}
else
{
AddNewMessage("本地", "转换阻塞模式成功!");
}
//绑定套接字
memset(&m_fromAddr, 0, sizeof(m_fromAddr));
m_fromAddr.sin_family = AF_INET;
m_fromAddr.sin_addr.s_addr = htonl( INADDR_ANY );
m_fromAddr.sin_port = htons( 12345 );
if(bind(m_socket, (struct sockaddr*)&m_fromAddr, sizeof(m_fromAddr)) < 0)
{
int err = WSAGetLastError();
CString text = "绑定套接字失败!";
CString errCode;
errCode.Format(" ErrCode = %d", WSAGetLastError());
AddNewMessage("本地", text + errCode);
KillTimer(10000);
m_SendButton.EnableWindow(FALSE);
}
else
{
AddNewMessage("本地", "绑定套接字成功!");
}
AddNewMessage("本地", "准备接收消息!");
m_NickNameText = m_hostip;
if(!GetNickName())
{
AfxMessageBox("请先修改一个好的昵称!");
}
m_NickName.SetWindowText(m_NickNameText);
BroadCastOnLine();
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CSimpleMessagerDlg::BroadCastOffLine()
{
CString Msg ="OFFL ";
Msg+=m_hostip;
BroadCastMessageToNet(Msg);
}
void CSimpleMessagerDlg::BroadCastOnLine()
{
CString Msg = "ONLI ";
Msg+=m_hostip;
Msg+=" ";
CString tmp;
m_NickName.GetWindowText(tmp);
Msg+=tmp;
BroadCastMessageToNet(Msg);
}
void CSimpleMessagerDlg::SendMessageToNet(const CString& ip, const CString& text)
{
SOCKADDR_IN broadCastAddr;
memset(&broadCastAddr, 0, sizeof(broadCastAddr));
broadCastAddr.sin_family = AF_INET;
broadCastAddr.sin_addr.s_addr = inet_addr(ip);
broadCastAddr.sin_port = htons(12345);
if(broadCastAddr.sin_addr.s_addr == 0 ||
broadCastAddr.sin_addr.s_addr == INADDR_NONE)
{
return;
}
int sendlength = sendto(m_socket, text, strlen(text), 0,
(struct sockaddr*)&broadCastAddr, sizeof(broadCastAddr));
if(sendlength != strlen(text))
{
return;
}
}
void CSimpleMessagerDlg::BroadCastMessageToNet(const CString& text)
{
//广播局域网中所有主机
for(int a = 0; a<255; a++)
{
CString targetIP;
targetIP.Format("192.168.%d.255", a);
SOCKADDR_IN broadCastAddr;
memset(&broadCastAddr, 0, sizeof(broadCastAddr));
broadCastAddr.sin_family = AF_INET;
broadCastAddr.sin_addr.s_addr = inet_addr(targetIP);
broadCastAddr.sin_port = htons(12345);
if(broadCastAddr.sin_addr.s_addr == 0 ||
broadCastAddr.sin_addr.s_addr == INADDR_NONE)
{
continue;
}
int sendlength = sendto(m_socket, text, strlen(text), 0,
(struct sockaddr*)&broadCastAddr, sizeof(broadCastAddr));
if(sendlength != strlen(text))
{
continue;
}
}
}
BOOL CSimpleMessagerDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam == VK_RETURN)
{
if(m_IPEdit.GetFocus() != NULL)
{
return FALSE;
}
}
if(pMsg->wParam == VK_ESCAPE)
{
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CSimpleMessagerDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CSimpleMessagerDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CSimpleMessagerDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
OnOK();
}
void CSimpleMessagerDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
this->KillTimer(10000);
this->KillTimer(10001);
BroadCastOffLine();
int result = closesocket(m_socket);
if(result)
{
AddNewMessage("本地", "关闭套接字失败!");
}
else
{
AddNewMessage("本地", "成功关闭套接字!");
}
result = WSACleanup();
if(result)
{
AddNewMessage("本地", "WINSOCK2.2 清理出错!");
}
else
{
AddNewMessage("本地", "WINSOCK2.2 清理成功!");
}
//AfxMessageBox("");
OnCancel();
}
void CSimpleMessagerDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString sendIP;
GetDlgItemText(IDC_EDIT4, sendIP);
CString sendtext;
GetDlgItemText(IDC_EDIT2, sendtext);
//只取256字节长度
if(sendtext.GetLength()>200)
{
AfxMessageBox("长度大于200,请修改后再发送!");
return;
}
if(sendtext.GetLength() == 0)
{
AfxMessageBox("不准发空消息!");
return;
}
char ipaddress[65536];
strcpy(ipaddress, sendIP);
char sendtexta[256];
strcpy(sendtexta, sendtext);
memset(&m_toAddr, 0, sizeof(m_toAddr));
m_toAddr.sin_family = AF_INET;
m_toAddr.sin_addr.s_addr = inet_addr(ipaddress);
m_toAddr.sin_port = htons(12345);
if(m_toAddr.sin_addr.s_addr == 0 ||
m_toAddr.sin_addr.s_addr == INADDR_NONE)
{
AddNewMessage("本机", "消息发送失败!");
return;
}
int sendlength = sendto(m_socket, sendtexta, strlen(sendtexta), 0,
(struct sockaddr*)&m_toAddr, sizeof(m_toAddr));
if(sendlength != strlen(sendtexta))
{
AddNewMessage("本机", "消息发送失败!");
return;
}
AddNewMessage("本机", sendtext);
m_SendMsgText.SetWindowText("");
m_SendMsgText.SetFocus();
}
void CSimpleMessagerDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
m_ReciveMsgEdit.SetWindowText("");
}
void CSimpleMessagerDlg::BroadCastNewNickName()
{
CString newNickName;
m_NickName.GetWindowText(newNickName);
CString command = "CHNN " + m_hostip + CString(" ") + newNickName;
BroadCastMessageToNet(command);
}
void CSimpleMessagerDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
BroadCastNewNickName();
GetDlgItemText(IDC_EDIT5, m_NickNameText);
SaveNickName();
}
void CSimpleMessagerDlg::OnLbnSelchangeList1()
{
// TODO: 在此添加控件通知处理程序代码
int index = 0;
index = m_UserList.GetCurSel();
if(index == LB_ERR) return;
CString nickname;
m_UserList.GetText(index, nickname);
//获得IP地址
std::vector<UserStruct>::iterator it = m_UserTable.begin();
for(;it!=m_UserTable.end();++it)
{
if((*it).nickname == nickname)
{
SetDlgItemText(IDC_EDIT4, (*it).hostip);
break;
}
}
UpdateData();
}
void CSimpleMessagerDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
CString text;
GetDlgItemText(IDC_EDIT2, text);
//只取256字节长度
if(text.GetLength()>200)
{
AfxMessageBox("长度大于200,请修改后再发送!");
return;
}
if(text.GetLength() == 0)
{
AfxMessageBox("不准发空消息!");
return;
}
std::vector<UserStruct>::iterator it = m_UserTable.begin();
for(;it!=m_UserTable.end();++it)
{
SendMessageToNet((*it).hostip, text);
}
m_SendMsgText.SetWindowText("");
m_SendMsgText.SetFocus();
}
void CSimpleMessagerDlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知处理程序代码
BroadCastOnLine();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -