通过UDP采集数据,代码有问题,请教大家
通过UDP协议进行数据采集,首先通过本地机器(电脑)发送采集指令,
之后每秒钟进行设备发送数据包的接受和处理。
设备的数据采集厂家是这样要求的:
设备: IP = 192.168.1.252, 端口号:1031
电脑: IP = 192.168.1.101,端口号:1032
使用网络调试助手,按照下图设置是可以正常采集到数据的。
自己的代码如下,但接受不到数据。
BOOL CDeviceInterfaceMAXA02::StartMeasureUDP()
{
SOCKET m_Local;
SOCKADDR_IN m_LocalAddress; //本地地址
SOCKADDR_IN m_RemoteAddress; //远程地址
int m_LocalAddressLen = sizeof(SOCKADDR);
int m_RemoteAddressLen = sizeof(SOCKADDR);
// socket环境
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) return false;
// socket对象
m_Local = socket(AF_INET, SOCK_DGRAM, 0);
if (m_Local == INVALID_SOCKET)
{
closesocket(m_Local);
m_Local = INVALID_SOCKET;
return false;
}
unsigned long on = 1; //此值为0,会将套接字设置为阻塞(默认的);为1设置为非阻塞
if (0 != ioctlsocket(m_Local, FIONBIO, &on))
{
AfxMessageBox("设置为非阻塞失败.");
}
// 绑定占用<ip, port>
const char* ip = "192.168.1.101";
short port = 1032;
m_LocalAddress.sin_family = AF_INET;
m_LocalAddress.sin_addr.S_un.S_addr = inet_addr(ip);
m_LocalAddress.sin_port = 1032;
auto ret = bind(m_Local, (sockaddr*)&m_LocalAddress, sizeof(m_LocalAddress));
if (ret == SOCKET_ERROR)
{
closesocket(m_Local);
m_Local = INVALID_SOCKET;
return false;
}
listen(m_Local, 10);
// 接收和发送
m_RemoteAddress.sin_family = AF_INET;
m_RemoteAddress.sin_port = 1031;
m_RemoteAddress.sin_addr.S_un.S_addr = inet_addr("192.168.1.252");
m_RemoteAddressLen = sizeof(m_RemoteAddress);
int bytes_sent;
bytes_sent = sendto(m_Local, (char*)xaCS, 6, 0, (sockaddr*)&m_RemoteAddress, m_RemoteAddressLen);
bytes_sent = sendto(m_Local, (char*)xaRU, 6, 0, (sockaddr*)&m_RemoteAddress, m_RemoteAddressLen);
bytes_sent = sendto(m_Local, (char*)xaMC, 6, 0, (sockaddr*)&m_RemoteAddress, m_RemoteAddressLen);
bytes_sent = sendto(m_Local, (char*)xaGS, 6, 0, (sockaddr*)&m_RemoteAddress, m_RemoteAddressLen);
bytes_sent = sendto(m_Local, (char*)xaST1, 6, 0, (sockaddr*)&m_RemoteAddress, m_RemoteAddressLen);
bytes_sent = sendto(m_Local, (char*)xaST2, 6, 0, (sockaddr*)&m_RemoteAddress, m_RemoteAddressLen);
bytes_sent = sendto(m_Local, (char*)xaHV, 6, 0, (sockaddr*)&m_RemoteAddress, m_RemoteAddressLen);
bytes_sent = sendto(m_Local, (char*)xaCB, 6, 0, (sockaddr*)&m_RemoteAddress, m_RemoteAddressLen);
std::vector<char> ucBuffer;
ucBuffer.resize(24600);
while (1)
{
int recvLen = recvfrom(m_Local, ucBuffer.data(), 24600, 0, (sockaddr*)&m_LocalAddress, &m_LocalAddressLen);
}
closesocket(m_Local);
WSACleanup();
return true;
}
运行结果及详细报错内容
目前的问题是recvfrom返回的数据长度为-1。
希望达到的效果
希望像“网络调试助手”一样,1:“打开”本地机器(电脑)的IP地址和端口,2:实现电脑发送指令和接受数据。