目标
1.message的输入由edit_control进行,需要捕获输入。
2.用户的主机地址和发送地址不一样,需要分别设置并绑定。
设计RC外观
必备组件:主机IP与端口,从机IP与端口,消息框,发送,连接按钮。
可能的主要难点:
1.UDP数据发送的字节序问题。
2.输入过程中可能使用到的16进制问题。
主机套接字
主机套接字的建立由连接按钮发生,代码如下:
void CMFCUDPSendDlg::OnBnClickedConnect()
{
// TODO: 在此添加控件通知处理程序代码
//获取变量值
CString C_H_IP;
CString C_H_Port;
HOST_IP_E.GetWindowText(C_H_IP);
HOST_PORT_E.GetWindowText(C_H_Port);
//获取port的值
int H_port_i = _wtoi(C_H_Port);
if (H_port_i < 10000)
{
if (!host_sock.Create(H_port_i, SOCK_DGRAM, C_H_IP))
{
MessageBox(_T("创建主机套接字失败"));
}
else
{
CString str;
str.Format(_T("创建主机套接字成功\nIP:%ws\nPORT:%d\n"), C_H_IP.GetString(), H_port_i);
MessageBox(str);
}
}
else
{
MessageBox(_T("主机PORT不合法"));
}
}
实现效果:
需要注意的是,主机套接字是你的本地接收端,它的IP地址需要与你真实存在的IP与端口对应,你可以去网络设置里查看自己的IP地址有哪些可用。
客机套接字与预发送数据
1.创立客机套接字的主要目的不是为了接收信息而是为了发送信息,所以客机套接字本身的IP地址和端口不是很重要。
2.提供了一个预设的char数组模板,后续发送数据以此模板为蓝本,一个数据包不能太大。
//MSG_t接受消息结构体
typedef struct msg_t
{
char type;
char text[100];
} MSG_t;
void CMFCUDPSendDlg::OnBnClickedSend()
{
// TODO: 在此添加控件通知处理程序代码
//获取变量值
CString C_G_IP;
CString C_G_Port;
GUEST_IP_E.GetWindowText(C_G_IP);
GUEST_PORT_E.GetWindowText(C_G_Port);
//建立客机套接字
guest_sock.Create(0, SOCK_DGRAM, NULL);
//定义消息体
MSG_t msg = { 0 };
msg.type = 1;
int i = 0;
for (i = 0; i <= 98; i++)msg.text[i] = i;
msg.text[99] = ' \0';
//获取port的值
int G_port_i = _wtoi(C_G_Port);
if (G_port_i < 10000)
{
if (guest_sock.SendTo((char*)&msg, sizeof(msg), G_port_i, C_G_IP, 0) != SOCKET_ERROR)
{
CString str;
str.Format(_T("数据发送成功"));
MessageBox(str);
}
else
{
CString str;
str.Format(_T("套接字错误码 : %d"), GetLastError());
MessageBox(str);
}
}
else
{
MessageBox(_T("客机PORT不合法"));
}
}
实现效果:
可以看到,数据按字符串顺序发送给了UDP包出去了。
消息框string转为待发送格式消息
由消息框输入UDP数据的办法有很多,最好的办法是用excel表格,这样的UDP数据最直观,如果excel表格不行的话,还可以使用CGridControl这一类扩展控件来帮忙。
笔者综合考虑了一下各种可能的数据交互方式,最好的方式是用一个文件入,一个文件出。不要硬刚用MFC写出excel,可以直接用csv文件保存接收数据。
具体的办法往后继续说。