目前,我正在构建点对点网络架构,正处于创建接收功能的阶段,该功能将接受来自网络上多个客户端的消息。本质上,当调用recvfrom函数时 - 已向主客户端发送消息的最新客户端的地址被加载到名为fromAddr的sockaddr_in结构中。然后,该程序设计为循环遍历包含客户端类的多个实例的向量(每个实例都包含表示网络上的客户端的必要信息和功能),并找到其sockaddr_in结构与刚收到的客户端实例匹配的客户端实例信息。在该计划中,目前看来是如此:
void UDPClass::checkID(Message* mess, sockaddr_in fraeAddress)
{
sockaddr_in anAddr;
//Iterate through the vector of clients and find the one who sent the message
for(int i = 0; i<theClients.size(); i++)
{
anAddr = theClients[i].getAddress();
//if the address of the recieved message matches the address of the current client
if((anAddr.sin_addr == fraeAddress.sin_addr) && (anAddr.sin_port == fraeAddress.sin_port))
{
//Update local instance of the client so that its location data matches that of the recieved message
theClients[i].setX(mess->x);
theClients[i].setY(mess->y);
}
}
}
编译程序时,会报告以下错误:
错误3错误C2678:二进制&#39; ==&#39; :找不到哪个运算符采用类型&#39; IN_ADDR&#39;的左手操作数(或者没有可接受的转换)
正如可以推断的那样,我还尝试通过简单地比较两个sockaddr_in结构本身来评估表达式:
if(anAddr == fraeAddress)
报告相同的错误。问题是:如果没有创建一个带有重载运算符函数的sockaddr_in类,那么你可以用它来计算表达式,这是实现这种比较最简单的方法吗?
答案 0 :(得分:4)
您可能希望像这样测试in_addr的unsigned long成员:
if((anAddr.sin_addr.s_addr == fraeAddress.sin_addr.s_addr) && (anAddr.sin_port == fraeAddress.sin_port))
或Windows:
if((anAddr.sin_addr.S_addr == fraeAddress.sin_addr.S_addr) && (anAddr.sin_port == fraeAddress.sin_port))
答案 1 :(得分:0)
根据您的地址的确切起源,有时字节比较不起作用:IPv4地址可能存储在sockaddr_in
或sockaddr_in6
中。
sockaddr_in6
可能包含也可能不包含sin6_scope_id
和sin6_flowinfo
,并且排列可能会有所不同。
您是否只需要IPv4和IPv6,还是需要处理其他类型的套接字? (这些天编写纯IPv4程序是不可原谅的。)如果是这样(也许即使你做需要支持unix,netlink,raw或模糊套接字类型),我建议转换所有IP地址到IPv6,然后使用您自己的类进行比较。
(你也不应该使用线性搜索)。