【问题标题】:assignin sockaddr to another changes the addr?将 sockaddr 分配给另一个更改地址?
【发布时间】:2010-08-27 01:26:14
【问题描述】:

在尝试以下操作时,第二个 sockaddr 中的地址发生了变化:

/*Stuff*/
sockaddr add1, add2;
recvfrom(/*socket*/, /*buffer*/, /*count*/, /*flag*/, &add1, /*fromlen*/);

add2 = add1; //The sa_data - part changes O_o...

/*Stuff*/

有人知道为什么吗?...

编辑:1.我将 sockaddr 更改为 sockaddr_storage,它绝对有足够的空间用于 sockaddr_in! 2.我在初始化时将结构设置为零 3. 我为我的副本/作业愿望写了一个副本规则:

memcpy(&AddrTarget, &AddrSource, sizeof(sockaddr_storage));

但这也无济于事!...我绝望了:(...

【问题讨论】:

    标签: c++ sockets copy winsock variable-assignment


    【解决方案1】:

    当您调用recvfrom() 时,fromlen 是如何设置的?如果fromlen > sizeof(add1),你可能会不小心写到add2

    Beej's Guide 建议您使用struct sockaddr_storage 类型的局部变量,保证足够大以容纳正在使用的任何struct sockaddr_foos。

    【讨论】:

    • 不知道这个,很好。
    • 是的...我确实使用了这个,但是:它仍然不起作用...我正在做的是:SOCKADDR_STORAGE x, y; recvfrom(/*recv addr into x*/); y = x;
    【解决方案2】:

    可能没有复制整个结构。 sa_data 可以长于 14 个元素。但是复制会丢失第 14 个值之后的位。

    http://www.delorie.com/gnu/docs/glibc/libc_305.html

    【讨论】:

    • 使用 SOCKADDR_STORAGE 结构并在需要时进行转换是否是一种解决方案?...
    【解决方案3】:

    假设 TCP 的常见情况 - 您可能想要使用 sockaddr_in,它为额外的字段留出空间。

    【讨论】:

    • recvfrom 通常与 UDP 一起使用。
    猜你喜欢
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多