【问题标题】:copying sockaddr_storage to another sockaddr_storage changes address将 sockaddr_storage 复制到另一个 sockaddr_storage 更改地址
【发布时间】:2010-08-29 15:27:38
【问题描述】:

嘿...在最近的一个问题中(没有人对最后的更改做出反应)我在分配由recvfrom 填充的 sockaddr 结构时遇到问题。

正如我被告知的那样,我确实将我的 sockaddr 更改为 sockaddr_storage 并在最后一刻将其转换为确保有足够的空间用于地址...

但是问题

sockaddr_storage s1, s2; 
/*recv address into s1*/ 
s2 = s1;

memcpy(&s2, &s1, sizeof(sockaddr_storage));

不工作...任何人都有解决方案来复制 sockaddr_storage 或至少将地址保存在结构中并稍后获取原始值?...

谢谢。

编辑:sockaddr 和 sockaddr_storage (msdn) 的定义:

struct sockaddr {
        ushort  sa_family;
        char    sa_data[14];
};


typedef struct sockaddr_storage {
  short   ss_family;
  char    __ss_pad1[_SS_PAD1SIZE];
  __int64 __ss_align;
  char    __ss_pad2[_SS_PAD2SIZE];
} SOCKADDR_STORAGE, *PSOCKADDR_STORAGE;

【问题讨论】:

  • 不知道的可以提供一下sockaddr_storage struct/class的定义吗?
  • 谢谢。根据定义,我希望 memcpy 能够工作。你能告诉我们为什么你认为 memcpy 不起作用吗?
  • 我第一次注意到它,因为客户从未收到过答复。当然,这可能是由于 UDP 的自然行为不是可靠的协议。但是当我使用recvfrom的原始地址时,它确实有效......所以我确实设置了一些断点并手动读出了地址,瞧:复制后地址改变了......

标签: c++ copy winsock variable-assignment


【解决方案1】:

您的复制似乎是正确的(至少是memcpy)。我怀疑你误解了结果。您可以尝试使用memcmp 验证复制是否成功。

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2014-07-29
    • 2011-11-12
    相关资源
    最近更新 更多