2009-11-15 24 views
4

在C中使用套接字,在函数中这样做是否安全?在C中使用connect()时使用临时sockaddr_in是否安全?

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; 
} 

更具体地说,其原型在给定的“人”连接的

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

请问如果SOCKADDR结构将在后面看不上我被惩罚的地方向下行?

回答

4

你在做什么是完全安全的 - 套接字从sockaddr获取它需要的任何东西的副本。

+0

正是我在找的,谢谢! – Asuah

0

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

0

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

从逻辑上讲,对于另一个函数来说,访问该指针是非常困难的,唯一可能发生的方式是,如果connect()函数将指针全局存储在某个地方,那完全是疯狂的,并且不会产生任何感觉,如果曾经有一个套接字API,那么你应该杀死你自己或者该实现的开发者。

+0

所以,为了完全清楚,我应该保留sockaddr结构,因为一旦这个函数弹出堆栈,结构的内存就是公平的游戏(当我关闭套接字时它是免费的)?对我来说这似乎完全符合逻辑,我主要对连接之后套接字是否继续使用该结构感到好奇,这会在内存被丢弃时导致破坏。 – Asuah

+0

不,你不需要保存... connect()函数在sockaddr返回时完成,正如我在我的回复中所说的,没有一个理智的connect()实现会尝试再次访问该内存。 –

相关问题