我刚刚开始使用Poco库。我有两个计算机使用Poco的DatagramSocket对象进行通信时遇到问题。具体来说,receiveBytes函数似乎没有返回(尽管运行Wireshark并且看到我发送的UDP数据包到达目标计算机)。我认为我省略了一些简单的事情,这完全归功于我的一个愚蠢的错误。我使用Visual Studio Express 2010在Windows 7上编译了Poco 1.4.3p1。下面是代码片段,显示了我如何使用Poco。任何建议将不胜感激。
发送
#include "Poco\Net\DatagramSocket.h"
#include "Serializer.h" //A library used for serializing data
int main()
{
Poco::Net::SocketAddress remoteAddr("192.168.1.140", 5678); //The IP address of the remote (receiving) machine
Poco::Net::DatagramSocket mSock; //We make our socket (its not connected currently)
mSock.connect(remoteAddr); //Sends/Receives are restricted to the inputted IPAddress and port
unsigned char float_bytes[4];
FloatToBin(1234.5678, float_bytes); //Serializing the float and storing it in float_bytes
mSock.sendBytes((void*)float_bytes, 4); //Bytes AWAY!
return 0;
}
接收(我遇到问题)
#include "Poco\Net\DatagramSocket.h"
#include "Poco\Net\SocketAddress.h"
#include "Serializer.h"
#include <iostream>
int main()
{
Poco::Net::SocketAddress remoteAddr("192.168.1.116", 5678); //The IP address of the remote (sending) machine
Poco::Net::DatagramSocket mSock; //We make our socket (its not connected currently)
mSock.connect(remoteAddr); //Sends/Receives are restricted to the inputted IPAddress and port
//Now lets try to get some datas
std::cout << "Waiting for float" << std::endl;
unsigned char float_bytes[4];
mSock.receiveBytes((void*)float_bytes, 4); //The code is stuck here waiting for a packet. It never returns...
//Finally, lets convert it to a float and print to the screen
float net_float;
BinToFloat(float_bytes, &net_float); //Converting the binary data to a float and storing it in net_float
std::cout << net_float << std::endl;
system("PAUSE");
return 0;
}
感谢您的时间。
答案 0 :(得分:2)
POCO套接字以Berkeley套接字为模型。您应该阅读Berkeley套接字API的基本教程,这将使您更容易理解POCO OOP套接字抽象。
您无法在客户端和服务器上连接()。您只在客户端上连接()。使用UDP,connect()是可选的,可以跳过(然后你必须使用sendTo()而不是SendBytes())。
在服务器上,您可以在通配符IP地址上绑定()(意味着:然后将在主机上的所有可用网络接口上接收),或者绑定到特定的IP地址(意味着:将仅在该IP上接收)地址)。
查看您的接收器/服务器代码,您似乎希望过滤远程客户端的地址。你不能用connect()来做,你必须用receiveFrom(缓冲区,长度,地址)读取,然后在“地址”上过滤自己。
安全方面,请小心使用您收到的UDP数据包的源地址所做的假设。欺骗UDP数据包是微不足道的。换句话说:不要根据IP地址(或任何没有通过适当加密保护的内容)做出认证或授权决定。
POCO演示文稿http://pocoproject.org/slides/200-Network.pdf通过代码片段解释了如何使用POCO进行网络编程。有关DatagramSocket的信息,请参见幻灯片15,16。请注意,在幻灯片15上有一个拼写错误,用syslogMsg.data()替换msg.data(),msg.size(),syslogMsg.size()以编译: - )
还可以查看“poco / net / samples”目录中的简短示例,其中还显示了使用POCO的最佳做法。