void Link::keepalive(bool enable){
int opt = enable? 1 : 0;
::setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&opt, sizeof(opt));
}
我在一些更低级别的c函数中看到如下代码,特别是当它涉及套接字和网络操作时。
我来自python背景,我确实四处寻找关于(void *)&opt
正在做什么的好解释,但还没有
找到一个很好的解释。
我知道引用只是一个有限制的指针。
答案 0 :(得分:3)
setsockopt
int setsockopt(int socket, int level, int option_name,
const void *option_value, socklen_t option_len);
它的第二个参数应该是void *
类型。要使&opt
类型为void *
,它会被设置为该类型。
另请注意,&opt
是opt
对象的地址。它不是参考。
答案 1 :(得分:0)
确实存在相当混乱,因为setsockopt()支持大量不同的选项(SO_KEEPALIVE只是其中之一)。
要启用传递任何参数(包括将来的扩展),他们已经说过setsockopt()将接受指向参数的指针,其中参数类型为 any指针(由option_name参数隐式定义,在本例中为SO_KEEPALIVE)。
,"任何指针"写作" void *"
& opt is"指向opt" (或" opt的地址")
as" opt"有类型int,"& opt"类型为int *,因此要将其转换为void *,有一个"显式转换" (void *)& opt in your code
这种诡计虽然在C API中很常见,但在C ++中通常是不鼓励的,所以不要把它作为"如何编写C ++程序的例子"
答案 2 :(得分:0)
查看MSDN的setsockopt功能文档,特别是备注部分:
有两种类型的套接字选项:启用或禁用功能或行为的布尔选项,以及需要整数值或结构的选项。要启用布尔选项,optval参数指向非零整数。要禁用选项optval指向等于零的整数。对于布尔选项,optlen参数应等于sizeof(int)。 对于其他选项,optval指向包含选项所需值的整数或结构,而optlen是整数或结构的长度。
在C API中,通常的做法是传递函数参数,这些函数参数可以是与指向内存中地址的最常规指针类型(void *)
不同的类型/长度。
&opt
会将指针/地址返回到opt
类型的(int *)
,因此需要将其转换为(void *)
。另外,在为C ++编写时,更喜欢使用explicit type conversions。