我可以用temp addr结构调用bind()吗?

时间:2012-10-01 20:47:29

标签: c sockets

bind()函数将const struct sockaddr *addr作为参数之一。我可以传递一个临时sockaddr结构,该结构将在bind()调用后立即删除吗?

void bindMe(int socket) {
    struct sockaddr_in addr = {...};
    bind(socket, (struct sockaddr_in*)&addr, sizeof(sockaddr_in));
}
// addr is no more exist after function calling, 
// but I still want to work with the socket.

此外,POSIX中有很多函数将指针指向结构。如何在函数调用后确定是否可以释放结构?

1 个答案:

答案 0 :(得分:6)

是的,你可以这样做。 bind是一个同步系统调用,所以一旦它返回,内核就完成了所有参数。

如果套接字是非阻塞的并且bind返回EINPROGRESS以指示绑定是异步发生的,那么释放结构仍然是安全的。当操作异步完成时,内核会在内部复制结构。

  

如何在函数调用后确定是否可以释放结构?

阅读文档。大多数POSIX函数是同步的,并且在函数返回后可以安全地释放参数,但这并不总是正确的。如果您不确定,请阅读文档。显然,如果程序中有多个线程,则在API调用正在进行时,不应同时从另一个线程修改数据。