【问题标题】:Issue with Comparing socket addresses比较套接字地址的问题
【发布时间】:2012-04-09 23:58:18
【问题描述】:

我目前正在开发一个 UDP 应用程序,该应用程序允许两个用户使用 winsock 库相互交谈。目前,当我的程序运行时,它首先将 sockaddress 保存到向量中,然后当用户发送消息时,它将地址与向量中的第一个地址进行比较。当我调试和比较被比较的值时,它们完全相同,但我的 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]&amp;clientAddress. 之后更具体地使用.sa_data

谢谢

【问题讨论】:

  • 我怀疑cbClientAddress 的初始化存在问题(应该是socklen_t 类型并比较错误的长度。您应该在调用@987654328 之前将此变量初始化为sizeof(clientAddress) @ 然后只比较结构中实际使用的字节数,而不是比较整个结构。你能说明你是如何初始化cbClientAddress的吗?
  • @Celada 在将变量添加到向量之前,我确实将变量初始化为 sizeof(clientAddress)。我只是使用 clientAddress 作为连接的唯一标识符
  • 顺便说一句,我强烈不建议这样做,除非你别无选择。您应该仅将源地址用作回复地址和用于记录/授权目的。除非别无选择,否则永远不要使用它来识别客户。
  • @DavidSchwartz - 该程序仅供个人使用,我需要登录用户,以便将消息重定向到连接到服务器的不同客户端
  • @DavidSchwartz 我 100% 同意你的观点,如果这是为了公司或非个人用途,我不想收集这些信息

标签: c++ sockets networking chat winsock2


【解决方案1】:

多个问题:

  • 在调用recvfrom之前,您需要将cbClientAddresssocklen_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 之间的大小差异)可能是垃圾。你不想比较它。这不仅需要在向量中记住结构本身的内容,而且还需要显着长度。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2020-02-06
    • 2012-07-27
    • 2011-01-20
    • 1970-01-01
    • 2013-12-26
    相关资源
    最近更新 更多