【问题标题】:Is it ok to pass a socket to a function as const?可以将套接字作为 const 传递给函数吗?
【发布时间】:2021-02-22 22:27:51
【问题描述】:

假设我有一个名为 socket 的 Windows 套接字。如果 socket 被传递给一个不写入它的函数。例如,说一个向客户端发送简单消息/字节的函数,如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 总是在可写内存中,无论范围如何?

【问题讨论】:

  • 检查套接字是如何在你的库 WinSocks2 中定义的。它应该类似于HANDLEvoid * - 因为你可以像 const 一样传递它(你最好这样做)。
  • 我就是这么想的,因为它更安全。
  • 写入内存 - 表示它被分配在写入内存区域中。见VirtualAlloc
  • @VictorGubin 在 Winsock 中,SOCKET 是一个UINT_PTR,即一个指针大小的整数。这不是HANDLE/void*
  • 注:'send(socket, data, sizeof(data), 0);'只会发送 sizeof(a pointer), bytes.

标签: c windows sockets winsock file-descriptor


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    SOCKET 只是一个整数(具体而言,SOCKETUINT_PTR 的别名,即指针大小的无符号整数),因此在您的示例中将其传递为 @ 并不重要987654324@ 与否,因为您是按值传递它send() 采用非 const 值获取 SOCKET,因此无论如何您的 SOCKET 都会按值复制。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多