可以将套接字作为 const 传递给函数吗?

Is it ok to pass a socket to a function as const?

假设我有一个名为 socket 的 windows 套接字。如果 socket 被传递给一个不写入它的函数。例如,假设一个函数向客户端发送一个简单的 message/bytes,例如 Hello you're connected to the server!。 例如:

void send_hello(SOCKET socket, char* data) {
    send(socket, data, sizeof(data), 0);
}

将套接字作为 const 传递是否安全?例如:

void send_hello(const SOCKET socket, char* data) {
    send(socket, data, sizeof(data), 0);
}

我脑中的某些东西告诉我,我应该将 socket 作为 const 传递,而不是将其作为可写内存传递。我知道套接字是文件描述符,所以我显然对它们的工作方式以及它们是否总是或曾经被写入感到困惑。但是我的代码在将 socket 作为 const.

传递时有效

我的总体问题是:

可以将 SOCKET 对象类型的变量作为 const 传递吗?或者应该说 SOCKET 无论作用域如何,总是在可写内存中?

将顶级 const 添加到函数参数总是安全的。这甚至不是函数签名的一部分,它只是告诉编译器在函数体内你不会将参数更改为不同的值;这反过来让编译器在您重新分配参数的地方发现错误。

请注意,当您调用 send 时,第一个参数接收参数 socketcopy(也称为“按值传递”)。所以 socket 是否在可写内存中没有区别。

A SOCKET 只是一个整数(具体来说,SOCKETUINT_PTR 的别名,即指针大小的无符号整数),所以它并不重要你的例子,如果你把它作为 const 传递或不传递,因为你是按值 传递它 send() 接受非常量值的 SOCKET,所以无论如何你的 SOCKET 都会被值复制。

如果您愿意,可以通过 const 传递您的 socket 参数,这仅意味着您的函数无法为 socket 参数分配新值。它与 SOCKET 引用的底层套接字资源无关。