在C中使用connect()时使用临时sockaddr_in是否安全?

时间:2009-11-15 20:05:08

标签: c sockets

在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结构稍后被破坏,我会在某处受到惩罚吗?

3 个答案:

答案 0 :(得分:4)

您正在做的事情是完全安全的 - 套接字会从sockaddr中获取所需的任何内容。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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