想评估两个sockaddr_in结构之间的比较

时间:2015-03-20 22:39:13

标签: c++ network-programming p2p winsock2 sockaddr-in

目前,我正在构建点对点网络架构,正处于创建接收功能的阶段,该功能将接受来自网络上多个客户端的消息。本质上,当调用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类,那么你可以用它来计算表达式,这是实现这种比较最简单的方法吗?

2 个答案:

答案 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_insockaddr_in6中。 sockaddr_in6可能包含也可能不包含sin6_scope_idsin6_flowinfo,并且排列可能会有所不同。

您是否只需要IPv4和IPv6,还是需要处理其他类型的套接字? (这些天编写纯IPv4程序是不可原谅的。)如果是这样(也许即使你需要支持unix,netlink,raw或模糊套接字类型),我建议转换所有IP地址到IPv6,然后使用您自己的类进行比较。

(你也不应该使用线性搜索)。