代码之家  ›  专栏  ›  技术社区  ›  Swiss Frank

Windows网络:SOCKET和文件描述符是一样的吗?这样文件描述符API就可以用于套接字了?

  •  0
  • Swiss Frank  · 技术社区  · 1 年前

    我正在用较旧的编译器编译一些旧的基本网络类代码,这些代码在Linux和Windows 32位上都能很好地运行,特别是在Windows 95到2016或Windows 7上的Visual Studio 6.0。它有一些条件编译可以在VMS、Solaris、Linux和Windows上运行(例如,调用 WSAStartup() ,不同的标头, errno vs。 WSALastError() ,但它编译时没有出现错误(也没有关闭所有警告),运行良好。

    现在,为64位重新编译它需要一些更改,并且它在Fedora 40上通过了g++,没有任何警告,但Windows 11上的Visual Studio 2022发出了大量警告 socket() accept() 回来 SOCKET int .

    在过去的几十年里,我的代码在Windows上一直运行良好,使用 read() close() 的返回值 插座 接受 但现在我看到了 https://learn.microsoft.com/en-us/windows/win32/winsock/winsock-functions 只是 recv() closesocket() 记录在案。

    我能看到的可能性有:

    1. 大概 插座 和一个普通的文件描述符是一样的,并且可以完美地互操作,只是不幸的是 插座 接受 返回不同的类型,但只是铸造 插座 int 是必要和充分的 用于代替 闭合插座() ? 如果是, 文件在哪里写的?

    2. 它们在过去可能是一样的,但从Windows 10或64位开始就不是了? 如果是,什么时候?

    3. Windows同时提供API吗?我以前使用API A,现在默认使用API B?所以,我只需要在include之前定义一些东西,就可以得到这些函数返回的定义 int 插座 ? 如果是的话怎么办?

    4. 它们是不是从来都不一样,这完全是一个侥幸,这个代码曾经工作过? 如果是,怎么办?

    5. 我只是记错了这个代码的工作原理吗?例如,如果编写的代码不可能工作,那么15年或20年前使用此代码的应用程序可能总是使用 exit() 从来没有打过电话 ,或者可能正在记录 不起作用,但没有人注意到,因为该应用程序在工作日运行得很好,只是在关闭时记录了警告或搞砸了事情?(我仍然几乎肯定它读起来 插座 的与 阅读 但也许有一个子类覆盖了默认功能?)

    1 回复  |  直到 1 年前
        1
  •  1
  •   Remy Lebeau    1 年前

    但Windows 11上的Visual Studio 2022发出了大量警告 socket() accept() 回来 SOCKET int .

    这是正确的。他们有 从不 返回了 int , 总是 插座 ,是的别名 UINT_PTR ( unsigned int 在32比特中, unsigned __int64 64位)。

    在过去的几十年里,我的代码在Windows上一直运行良好,使用 read() close() 的返回值 插座 接受

    在Windows上,作为 插座 不是文件描述符。

    但现在我看到了 https://learn.microsoft.com/en-us/windows/win32/winsock/winsock-functions 只是 recv() closesocket() 记录在案。

    这些确实是你应该一直使用的东西。

    • 大概 插座 和一个普通的文件描述符是一样的,并且可以完美地互操作,只是不幸的是 插座 接受 返回不同的类型,但只是铸造 插座 int 是必要和充分的 用于代替 闭合插座() ? 如果是这样的话,文件在哪里说明?

    有些平台确实对套接字使用文件描述符,但Windows不是其中之一。

    • 它们在过去可能是一样的,但从Windows 10或64位开始就不是了?如果是,什么时候?

    • Windows同时提供API吗?我以前使用API A,现在默认使用API B?所以,我只需要在include之前定义一些东西,就可以得到这些函数返回的定义 int 插座 ? 如果是的话怎么办?

    • 它们是不是从来都不一样,这完全是一个侥幸,这个代码曾经工作过?如果是,怎么办?

    • 我只是记错了这个代码的工作原理吗?例如,如果编写的代码不可能工作,那么15年或20年前使用此代码的应用程序可能总是使用 exit() 从来没有打过电话 ,或者可能正在记录 不起作用,但没有人注意到,因为该应用程序在工作日运行得很好,只是在关闭时记录了警告或搞砸了事情?(我仍然几乎肯定它读起来 插座 的与 阅读 但也许有一个子类覆盖了默认功能?)

    我的 猜测 在Visual Studio中, open() 返回一个文件 HANDLE 广播到 int ,并通过 int 阅读 将投射回 手柄 打电话 ReadFile() CloseHandle() 分别地 读取文件() 将接受 插座 来自Winsock提供程序(请参阅 Socket Handles 但是 CloseHandle() 不会(其文件明确表示)。