1

目前我正在构建一个对等网络架构,并且正处于创建一个接收功能的阶段,该功能将接收来自网络上多个客户端的消息。本质上,当调用 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:二进制“==”:未找到采用“IN_ADDR”类型的左侧操作数的运算符(或没有可接受的转换)

正如可能推断的那样,我还尝试通过简单地比较两个 sockaddr_in 结构本身来评估表达式:

if(anAddr == fraeAddress)

哪个报告相同的错误。问题是:如果没有创建一个带有重载运算符函数的 sockaddr_in 类来允许您评估表达式,那么实现这种比较的最简单方法是什么?

4

2 回答 2

6

您可能希望像这样测试 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))
于 2015-03-20T23:18:38.497 回答
0

根据您的地址的确切来源,在某些情况下字节比较不起作用:IPv4 地址可能存储在sockaddr_insockaddr_in6. sockaddr_in6可能包含也可能不包含sin6_scope_idsin6_flowinfo并且对齐方式可能会有所不同。

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

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

于 2015-03-20T23:38:09.910 回答