gpt4 book ai didi

c++ - 比较套接字地址的问题

转载 作者:太空狗 更新时间:2023-10-29 23:08:20 25 4
gpt4 key购买 nike

我目前正在开发一个 UDP 应用程序,它允许两个用户使用 winsock 库相互交谈。目前,当我的程序运行时,它首先将 sockaddress 保存到一个 vector 中,然后当用户发送一条消息时,它会将地址与 vector 中的第一个地址进行比较。当我调试和比较被比较的值时,它们完全相同,但我的 if 语句转到了 else(它认为地址彼此不相等)

这是我的代码:

#include <WinSock2.h>

sockaddr clientAddress;

recvfrom( hSocket, msg, MAXLINE, 0, &clientAddress, &cbClientAddress );

myVector.pushback(clientAddress);

if (&clientAddresses[0] == &clientAddress)
{
//is the same address
}
else
{
//not the same address
}

我还尝试在 clientAddress[0]&clientAddress 之后使用 .sa_data 来更加具体。

谢谢

最佳答案

多个问题:

  • 在调用recvfrom之前,需要将cbClientAddress(socklen_t类型)初始化为地址的字节数您准备好接收的信息,如下所示:

     struct sockaddr clientAddress;
    socklen_t cbClientAddress;

    cbClientAddress = sizeof(clientAddress);
    recvfrom(hSocket, msg, MAXLINE, 0, &clientAddress, &cbClientAddress);
  • 调用后,cbClientAddress 将被接收到的地址的实际长度覆盖。这将比 sizeof(struct sockaddr) 更短。事实上,它将等于 sizeof(struct sockaddr_in),因为这是一个 UDP/IP 套接字。

  • 您必须只比较结构中实际包含数据的部分,而不是整个结构。结构中未使用的部分(struct sockaddr_instruct sockaddr 之间的大小差异)可能是垃圾。你不想比较它。这不仅需要记住 vector 中结构本身的内容,还需要记住有效长度。

  • 将保存的地址与您刚收到的地址进行比较时,请使用这种伪代码。不要尝试比较整个结构(包括尾随未使用的部分)。

    if (
    (saved_length == this_length) &&
    (memcmp(saved_sockaddr, this_sockaddr, this_length) == 0)
    ) {
    it's a match
    }
  • 您的代码 &clientAddresses[0] == &clientAddress 检查结构的地址是否相等。这意味着您要测试它是否是相同的结构,而不是您想要的,即测试它是否是具有相同内容的结构。按照上面的伪代码使用memcmp比较内容。

关于c++ - 比较套接字地址的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10081371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com