创建项目,初始化套接字
创建一个基于对话框的MFC项目(名称为UDP),高级功能选中Windows套接字
这个时候在CUDP类的InitInstance()方法中就会出现这样的代码用来初始化套接字
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
如果没有选中,手动添加也是可以的。
给对话框添加控件
控件ID | 关联变量名 | 类型 | 作用 |
---|---|---|---|
IDC_EDIT1 | m_edit | CEdit | 显示接收到的信息 |
IDC_EDIT2 | m_msg | CString | 保存发送的信息 |
IDC_EDIT3 | m_otherPort | UINT | 设置对方端口号 |
IDC_EDIT4 | m_myPort | UINT | 设置自己的端口号 |
IDC_IPADDRESS | m_IPAddressCtrl | CIPAddressCtrl | ip地址 |
修改控件IDC_EDIT1的一些属性
创建CSocket类的派生类CUDPSocket
要添加虚函数OnReceive(),这个函数的作用是用来截获收到的网络数据。
void CUdpSocket::OnReceive(int nErrorCode)
{
CString ipAdress;
wchar_t msg[1024];
UINT port;
int len=ReceiveFrom(msg, 1023, ipAdress, port);
msg[len] = '\0';
CUDPDlg* pDlg =(CUDPDlg*) AfxGetMainWnd();
pDlg->ShowMessage(msg, ipAdress, port);
CSocket::OnReceive(nErrorCode);
}
ShowMessage()函数是在CUDPDLG中定义的一个用于显示信息的函数,用于将发送方的IP地址,端口号,发送信息和发送时间显示在IDC_EDIT1控件上
void CUdpSocket::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
CString ipAdress;
char msg[1024];
UINT port;
int l=ReceiveFrom(msg, 1023, ipAdress, port);
msg[l] =0;
CTime time = CTime::GetCurrentTime();
CString str;
str.Format("的%d端口向你发送消息%s:\r\n%s\r\n", port,
time.Format("%Y-%m-%d %H:%M:%S"),msg);
ipAdress += str;
CUDPDlg* pDlg =(CUDPDlg*) AfxGetMainWnd();
int len = pDlg->m_edit.GetWindowTextLength();
pDlg->m_edit.SetSel(len, -1);
pDlg->m_edit.ReplaceSel(ipAdress);
CSocket::OnReceive(nErrorCode);
}
响应创建按钮创建套接字
void CUDPDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//创建stocket
UpdateData(true);
bool s=m_udpSocket.Create(m_myPort, SOCK_DGRAM);
if (0 == s)
{
CString str;
str.Format("创建socket失败:%d", GetLastError());
MessageBox(str);
}
else {
GetDlgItem(IDC_BUTTON1)->EnableWindow(false);
//如果创建成功禁用创建按钮
}
}
SOCK_DGRAM表示的就是UDP.
响应消息发射按钮
void CUDPDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
CString ipAdress;
m_IPAddressCtrl.GetWindowText(ipAdress);//获取IP地址控件上的ip地址
if (ipAdress.IsEmpty() || ipAdress == L"0.0.0.0")
MessageBox("请输入正确的ip地址");
if(m_myPort==0)
MessageBox("请输入当前主机端口号");
if(m_otherPort==0)
MessageBox("请输入对方端口号");
if(m_msg.IsEmpty())
MessageBox("请输入要发送的数据");
m_udpSocket.SendTo(m_msg, m_msg.GetLength(), m_otherPort,ipAdress);
CString str;
str.Format("我向\r\n%s:%d发送消息:%s\r\n", ipAdress.GetBuffer(), m_otherPort,m_msg.GetBuffer());;
m_edit.SetSel(m_edit.GetWindowTextLength(), -1);
m_edit.ReplaceSel(str);
}
使用Unicode字符集会出现中文后面更着韩文的情况,这个时候可以把字符集改成多字节字符集