This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS:AM437X 套接字结构问题

Guru**** 2924050 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/666281/rtos-am437x-socket-structures-question

工具/软件:TI-RTOS

您好,

我当前正在使用 NDK_2_24_03_35、并对 socketndk.h 中定义的几个结构有疑问

/* AF_iNet 系列(IPv4)套接字地址数据结构。 *

struct sockaddr_in{

uint8 sin 系列;//地址系列*/

uint16 sin 端口;/*端口*

struct in_addr sin addr;

int8 sin_zero_[8];//固定长度地址值*/

};

/*通用套接字地址存储数据结构。 *

struct sockaddr{

uint8 sa_family;//地址系列*/

char sa_data[14];//套接字数据*/

};

这些结构似乎在堆栈代码内被重叠和互换。

我的编译器填充结构 sockaddr_in、以避免成员 sin_port 位于奇数边界上、从而使16字节的大小与 socaddr 的大小相比较

什么是15字节?

在函数 NDK_recvf()中 ,如果 sizeof socaddr (15个字节)作为参数 int *PLEN 传入,则 以下检查失败:-

/*验证大小和指针*/

if (pname &&(!PLEN ||(pname->sa_family =AF_iNet &&* PLEN < sizeof (SA_IN)) 、其中 SA_IN 是 struct sockaddr_in、而* PLEN 是 struct sockaddr 的长度。

提前感谢

Brian

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是什么处理器?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它是 Sitara AM437X。

    此致
    Brian
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Brian、

    >>我的编译器禁止结构 sockaddr_in,以避免成员 sin_port 位于奇数边界上,从而使大小为16字节
    您使用的是哪种编译器? Wiki (processors.wiki.ti.com/.../Processor_SDK_RTOS_Release_Notes )中列出的 GCC-ARM-NONE - eabi-6-2017-Q1-update 是适用于 Sitara 器件的推荐版本。

    是否能够使用编译器选项禁用数据对齐和数据结构填充? 它在 GCC 中类似于__attribute__((packed)。

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    车架、
    我们无法禁用打包、因为某些库需要它。

    此致
    Brian
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Brian、

    如果不使用 PRSDK 建议的编译器、可能会遇到更多意外的不兼容问题。
    一种权变措施是、您可以尝试仅为 sockaddr_in 结构禁用填充并重建其库。

    此致、
    Garrett