Linux struct sockaddr_un 与 sockaddr

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3689925/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-04 23:06:54  来源:igfitidea点击:

struct sockaddr_un vs. sockaddr

clinuxsocketsstructclient-server

提问by Pavitar

How is struct sockaddrdifferent from struct sockaddr_un?

如何struct sockaddr不同struct sockaddr_un

I know that we use these structures in client-server modules, for binding the socket to the socket address. And we use a cast operator for it to accept struct sockaddr_un.

我知道我们在客户端 - 服务器模块中使用这些结构,将套接字绑定到套接字地址。我们使用强制转换运算符来接受 struct sockaddr_un

I want to know how different/similar they are, and why the cast operator?

我想知道它们有多么不同/相似,以及为什么要使用强制转换运算符?

采纳答案by paulsm4

"struct sockaddr" is a generic definition. It's used by any socket function that requires an address.

“struct sockaddr”是一个通用定义。它被任何需要地址的套接字函数使用。

"struct sockaddr_un" (a "Unix sockets" address) is a specific kind of address family.

“struct sockaddr_un”(“Unix 套接字”地址)是一种特定类型的地址族。

The more commonly seen "struct sockaddr_in" (an "Internet socket" address) is another specific kind of address family.

更常见的“struct sockaddr_in”(“Internet 套接字”地址)是另一种特定类型的地址族。

The cast is what allows the sockets APIs to accept a common parameter type that will actually be any one of several different actual types.

强制转换允许套接字 API 接受一个公共参数类型,该类型实际上是几种不同实际类型中的任何一种。

Here's a good link that shows several different address family definitions:

这是一个很好的链接,显示了几种不同的地址族定义:

http://www.cas.mcmaster.ca/~qiao/courses/cs3mh3/tutorials/socket.html

http://www.cas.mcmaster.ca/~qiao/courses/cs3mh3/tutorials/socket.html

回答by caf

A struct sockaddrshould generally only be used as the base type for a pointer. It is a structure intended to cover the common initial sequence of the members in the address family specific socket address types (struct sockaddr_un, struct sockaddr_in, struct sockaddr_in6etc.)

Astruct sockaddr通常只应用作指针的基类型。它是旨在覆盖在地址族特定套接字地址类型成员的公共初始序列的结构(struct sockaddr_unstruct sockaddr_instruct sockaddr_in6等)

The only member that you can rely on struct sockaddrhaving is a single sa_family_t, indicating the socket address family. The idea is that to obtain a sort of polymorphism - you can have a function that can operate on several different socket address types:

您可以依赖的唯一成员struct sockaddr是单个sa_family_t,表示套接字地址族。这个想法是为了获得一种多态性 - 您可以拥有一个可以对几种不同的套接字地址类型进行操作的函数:

void foo(struct sockaddr *sa)
{
    switch(sa->sa_family)
    {
    case AF_INET: {
        struct sockaddr_in *sa_in = (struct sockaddr_in *)sa;

        /* AF_INET processing */
    }

    case AF_UNIX: {
        struct sockaddr_un *sa_un = (struct sockaddr_un *)sa;

        /* AF_UNIX processing */
    }

/* ... */

Note though that code like the above is generally considered to break the "strict aliasing" rule in C - if you want to do that in your own code, you are supposed to use a union type:

请注意,虽然像上面这样的代码通常被认为违反了 C 中的“严格别名”规则 - 如果您想在自己的代码中这样做,则应该使用联合类型:

union sockaddr {
    struct sockaddr sa;
    struct sockaddr_in sin;
    struct sockaddr_un sun;
    /* ... */
};

void foo(union sockaddr *sa_union)
{
    struct sockaddr *sa = (struct sockaddr *)sa_union;

    switch(sa->sa_family)
    {
    case AF_INET: {
        struct sockaddr_in *sa_in = (struct sockaddr_in *)sa;

        /* AF_INET processing */
    }

    case AF_UNIX: {
        struct sockaddr_un *sa_un = (struct sockaddr_un *)sa;

        /* AF_UNIX processing */
    }

/* ... */