Winsock 中 SOCKET object 的范围是什么?

What is the scope of a SOCKET object in Winsock?

标题几乎说明了一切。我是 Winsock 的新手,我需要知道 SOCKET object 的范围是什么。

在 class 成员变量中使用它时是否需要担心它超出范围(因为当它返回时,它不是动态内存)?

谢谢。

我很确定这个问题的答案是否定的,但由于我找不到相关信息,所以我想我会把它放在那里,以供快速参考以后其他人。

在内部,SOCKET只是一些ID,指的是一些内部Windows结构。您可以像使用 HANDLE 或通常的指针一样使用它。

即如果它超出范围,什么也不会发生(但它可能会泄漏资源,例如 HANDLE,如果您忘记了 CloseHandle),如果您复制它 - 您将使用 2 个相同的套接字,它们指的是相同的 Windows 结构等

MSDN documentation for socket 表示如下:

When a session has been completed, a closesocket must be performed.

附带的示例就是这样做的。 documentation for closesocket比较厉害:

An application should always have a matching call to closesocket for each successful call to socket to return any socket resources to the system.

因此,只要您将 SOCKET 描述符保存在某处,您就可以在调用 closesocket 之前使用它。您可以考虑将其放入您自己的 RAII 类型中(或使用现有的类型)以避免泄漏。如果你 "forget" 描述符,你将泄漏内部资源。