在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结构稍后被破坏,我会在某处受到惩罚吗?
答案 0 :(得分:4)
您正在做的事情是完全安全的 - 套接字会从sockaddr中获取所需的任何内容。
答案 1 :(得分:0)
我从来没有遇到过这样做的问题。套接字结构之后必须保存sockaddr数据。
答案 2 :(得分:0)
sockaddr作为指针传递的原因是因为它是一个结构,并且他们希望避免不必要地复制它,如果它作为值传递会发生什么。 指针通常与单个存储器字一样大 - 在大多数情况下为32位或64位。一个sockaddr结构非常大,在我的平台上它至少有18个字节。
从逻辑上讲,下行的另一个函数很难访问该指针,唯一可能发生的方法是,如果connect()函数将指针全局存储在某个地方,这完全是疯了,没有任何意义如果有一个套接字API可以做到这一点,你应该自杀或开发该实现。