【发布时间】: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 中定义的。它应该类似于
HANDLE即void *- 因为你可以像 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