【问题标题】:Is it safe to use a temporary sockaddr_in when using connect() in C?在 C 中使用 connect() 时使用临时 sockaddr_in 是否安全?
【发布时间】:2009-11-15 20:05:08
【问题描述】:

在 C 中使用套接字,在函数中这样做是否安全?

int ConnectTo(char *ip, int port){
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    inet_pton(AF_INET, ip, &addr.sin_addr.s_addr);
    addr.sin_port = htons(port);

    int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(connect(sock, (struct sockaddr *) &addr, sizeof(addr))
        return sock;
    else
        return -1;
}

更具体地说,'man connect' 中给出的原型是

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

如果 sockaddr 结构稍后被丢弃,我会受到惩罚吗?

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    您正在做的事情是完全安全的 - 套接字从 sockaddr 获取它需要的任何内容的副本。

    【讨论】:

      【解决方案2】:

      我从来没有遇到过这样的问题。套接字结构之后必须保存 sockaddr 数据。

      【讨论】:

        【解决方案3】:

        sockaddr 作为指针传递的原因是因为它是一个结构,并且他们希望避免不必要地复制它,如果它作为值传递会发生这种情况。 指针通常与单个内存字一样大 - 大多数情况下为 32 或 64 位。 sockaddr 结构体很大,在我的平台上它至少有 18 个字节。

        从逻辑上讲,下线的另一个函数很难访问该指针,唯一可能发生的方法是,如果 connect() 函数将该指针全局存储在某个完全疯狂且没有任何意义的地方如果曾经有一个套接字 API 可以做到这一点,那么您应该杀死自己或该实现的开发人员。

        【讨论】:

        • 所以,为了完全清楚,我应该保留 sockaddr 结构,因为一旦这个函数从堆栈中弹出,结构的内存就是公平的游戏(并在我关闭套接字时释放它)?对我来说似乎完全合乎逻辑,我最好奇的是套接字在连接后是否会继续使用该结构很长时间,如果内存被丢弃,这将导致破坏。
        • 不,你不需要保留它... connect() 函数一旦返回就使用 sockaddr 完成,正如我在回复中所说,没有任何合理的 connect() 实现会尝试访问又是那段记忆……
        猜你喜欢
        • 1970-01-01
        • 2015-12-11
        • 2013-05-21
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-18
        • 1970-01-01
        相关资源
        最近更新 更多