簡體   English   中英

sin_family的網絡字節順序

[英]Network Byte Order for sin_family

我正在從Ubuntu盒子上的python向vxworks計算機上的C程序發送UDP消息。 vxworks計算機上的字節序與網絡字節順序不匹配,因此我被迫使用ntohs,ntohl等交換字節順序。

我正在從UDP連接中讀取內容,然后嘗試確定“家族”,因此我知道我是否應該解碼IPV4或IPV6。 我想做這樣的事情...但是不起作用。

struct sockaddr data = {};
char udp_ip[INET6_ADDRSTRLEN] = {0};
// ... (recvfrom ...)
if (AF_INET == data.sa_family)
{
    struct sockaddr_in*s = (struct sockaddr_in *)&data;
    const char *addr = inet_ntop(AF_INET, &s->sin_addr, udp_ip, sizeof(udp_ip));
    udp_port = ntohs(s->sin_port);
    ...
}
if (AF_INET6 == data.sa_family)
{
    struct sockaddr_in6 *s = (struct sockaddr_in *)&data;
    const char *addr = inet_ntop(AF_INET6, &s->sin6_addr, udp_ip, sizeof(udp_ip));
    udp_port = ntohs(s->sin6_port);
    ...
}

我曾經看到過端口,並且交換了類似的字段,但是我發現該系列是一個多字節字段。 我發現代碼不起作用,因為我的sa_family值超出范圍。 在這台機器的標頭中,最大的AF_ *值是40。我看到的值超過500。我看起來像sa_family上的字節已交換,我也需要交換其字節順序。 就像是 :

const sa_family_t family = ntohs(data.sa_family);

然后,我將在if檢查中使用該系列變量。 問題 :這合理嗎? 我從來沒有見過在這個家庭做過ntoh *。 我很驚訝它是多字節(sizeof(data.sa_family)== 2)。

我認為我的python代碼不相關,但出於完整性考慮。

udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_sock.bind(('', 0))
data = self.create_data()
udp_sock.sendto(data, (ip, port))     

在我什至無法解析數據之前,所發送的數據就無關緊要,如果數據像“ FOO”那么簡單,問題就出現了。

我檢查過的其他文章: 網絡數據包中的哪些字段應轉換為網絡字節順序以及網絡字節順序和字節序問題

我還閱讀了這篇文章,這似乎與我所看到的相矛盾。 struct sockaddr_in bind()的成員字節順序

相反,相反(但未顯示),當從我的vxworks(非網絡字節順序計算機)發回消息到我的另一台計算機時,我必須在設置消息時進行提示(AF_INET),否則它將不起作用。 我很困惑,因為我在這里看到了相互矛盾的建議,所以我認為我肯定在做其他根本上是錯誤的事情。 問題 :如果您不需要轉換家庭的建議(htons / ntohs),我在做什么錯呢?

家庭不需要be依。 它本身不傳輸。 見:

https://zh.wikipedia.org/wiki/IPv4

https://zh.wikipedia.org/wiki/IPv6

如果版本值為4,則其IP版本== 4 ... IPV4。 如果其版本== 6 ..則為IPV6。

真正的問題是我正在交叉編譯,並且目標的頭文件版本錯誤。 我有一個這樣的結構:

struct sockaddr {
    u_short sa_family;              /* address family */
    char    sa_data[14];            /* up to 14 bytes of direct address */
};

在實際系統上,當結構包含另一個字段時:

/*
 * Structure used by kernel to store most
 * addresses.
 */
struct sockaddr {
    unsigned char   sa_len;      /* total length */
    sa_family_t     sa_family;   /* address family */
    char            sa_data[14]; /* actually longer; address value */
};
#define SOCK_MAXADDRLEN 255     /* longest possible addresses */

多余的字符和字節序是我問題的根源。 我看到的是一個像528的值。這是當字節合並並視為兩個無符號字節時,長度“ 10”和家族“ 2”的組合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM