我即将在 C++ 中开发一些与套接字相关的东西,并希望该软件从一开始就尽可能地在 Windows 和 Linux 之间移植(让它以后移植很棘手。)
我查看了不同的库,有一个来自alhem.net的 C++ 库,当然还有 boost::asio。boost::asio 看起来很有前途,但对于这么小的应用程序来说将是一个非常大的依赖项。
自己写这些东西是否值得,还是我应该只使用图书馆?如果我自己做,主要的陷阱是什么?
我即将在 C++ 中开发一些与套接字相关的东西,并希望该软件从一开始就尽可能地在 Windows 和 Linux 之间移植(让它以后移植很棘手。)
我查看了不同的库,有一个来自alhem.net的 C++ 库,当然还有 boost::asio。boost::asio 看起来很有前途,但对于这么小的应用程序来说将是一个非常大的依赖项。
自己写这些东西是否值得,还是我应该只使用图书馆?如果我自己做,主要的陷阱是什么?
我开发了一些围绕套接字的便携式包装器。确保您不会走下由 WinSock2 事件构成的糟糕的不归路。除此之外,在我看来,最大的区别是:
::WSAStartup()
, 在 Windows 中将其关闭,运行::WSACleanup()
; 在 Linux 中什么都不做,close()
在 Linux 中是closesocket()
在 Windows 中,SO_RCVBUF
and来设置它们SO_SNDBUF
,::ioctlsocket()
在 Windows、Linux ::fcntl()
、<sys/socket.h>
朋友在Linux,<WinSock.h>
在Windows,::select()
等待数据到达,fd_set
s 在 Windows/Linux 上完全不同;这仅在您需要优化fd_set
s 的初始化时才相关,例如在添加/删除任意套接字时,::recvfrom()
,您可以考虑::sendto()
在 Linux 下使用来释放停止的线程。我曾经需要的其他一切都是从 låda 中解决的。
Winsocks 与 Posix 套接字不太兼容:
SOCKET
. 在 Posix 上,它只是一个文件描述符 ( int
),您可以在其上执行正常read()
和write()
调用。recv()
和上的某些选项send()
。shutdown()
or关闭 Windows 套接字close()
。而是类似的东西closesocket()
。肯定有更多的不同,但这就是我现在能记住的。如果您希望 Winsocks 具有可移植性,您将拥有一个用于关闭套接字、打印错误消息等的小型库。
我个人可能会选择boost::asio
(不过我从未使用过它)。
看看“自适应通信环境”(ACE)库: (ACE 主页) 它提供了一些很好的抽象和很大的灵活性,所有这些都集中在一个支持 Windows、MacOS 和 Linux 的可移植库中。它的学习曲线有点陡峭,但我从中获得了很好的价值。
老实说,我会优先使用 boost::asio。如果你真的想对套接字 API 感到厌烦,你可以在 Windows 和 Linux 上使用标准的 BSD 风格的套接字 API——只是在 Windows 上你必须链接到(并初始化)Winsock2,而在Linux 你不会有一个单独的库来链接。
您将使用多少插座的东西?我已经完成了几个应用程序,其中套接字的东西非常高级(打开、读取、写入),并且从 Windows 到 Linux 都可以完美运行。如果它不止于此 - 继续提升。