【问题标题】:What does the number represent when printing a socket in C++?在 C++ 中打印套接字时,数字代表什么?
【发布时间】:2020-12-08 03:18:21
【问题描述】:
SOCKET sampleSocket;
cout << sampleSocket << endl;
// End up with a number

我注意到,当我使用 cout 打印套接字时,我收到了一个数字——该数字代表什么,我如何在使用 cout 之外检索它?

【问题讨论】:

  • 谢谢!那么套接字将类似于什么数据类型。我知道 HANDLE 是一个无符号整数,但是 SOCKET 类型是什么?
  • 它可能是隐藏在您程序的进程信息中的表中的索引。在这个表中,是实际的套接字控制块,它充满了所有你不会废话的小实现细节。但坦率地说,它几乎可以是任何东西。不管它是什么,也不管它是如何存储的,这个数字是您从某处查找真实套接字信息的关键。
  • @ZacharyZhu 如果你看SOCKET的实际声明,你会发现它只是UINT_PTR的一个typedef,它是一个指针大小的无符号整数。
  • @user4581301 在 Windows 上,SOCKET 是一个实际的内核对象,就像一个文件、管道等,其中 SOCKET 包含一个指向实际对象的句柄(相当于一个指针) .它不是进程本地表的索引。

标签: c++ sockets tcp winsock


【解决方案1】:

在 Winsock 应用程序中,套接字描述符不是文件描述符,必须与 Winsock 函数一起使用。 [...] 因为 SOCKET 类型是无符号的,从例如 UNIX 环境编译现有源代码可能会导致编译器警告有关有符号/无符号数据类型不匹配的警告。

(见Socket Data Type

从这个文档我们可以得知它是一个unsigned 数据类型。但是,确切的整数类型仍然是实现定义的。它可能是 32 位或 64 位 unsigned 整数。

【讨论】:

  • SOCKET 只是UINT_PTR 的类型定义,你可以在winsock.hwinsock2.h 中看到这个声明
  • @RemyLebeau 这可能是实现,但没有指定它必须是UINT_PTRuint64_t 现在可能在您的平台上定义为 unsigned long long,但这并不意味着它总是如此。
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多