我即将在C ++中开发一些与套接字相关的东西,并且希望软件从一开始就尽可能在Windows和Linux之间移植(以后便携可用。)
我看过不同的库,有一个来自alhem.net的C ++,当然还有boost :: asio。 boost :: asio看起来非常有前景,但对于这么小的应用程序来说,这将是一个非常大的依赖。
是否值得自己写这些东西或者我应该只使用一个库?如果我自己这样做会有什么主要的陷阱?
答案 0 :(得分:5)
我在套接字周围开发了一些便携式包装器。确保你没有沿着由WinSock2事件构成的无法回归的蹩脚线路走下去。除此之外,正如我所看到的,最大的区别是:
::WSAStartup()
,在Windows中关闭它,运行::WSACleanup()
;在Linux中什么都不做,close()
在Windows中为closesocket()
,SO_RCVBUF
和SO_SNDBUF
::ioctlsocket()
,在Linux中使用::fcntl()
,<sys/socket.h>
和Linux中的朋友,Windows中的<WinSock.h>
,::select()
等待数据到达,fd_set
在Windows / Linux上完全不同;这仅在您需要优化fd_set
的初始化时才有意义,例如在添加/删除任意套接字时,::recvfrom()
的套接字,您可以考虑使用::sendto()
来释放Linux下的停滞线程。我所需要的其他所有东西都是从låda中完成的。
答案 1 :(得分:3)
Winsocks与Posix套接字不兼容:
SOCKET
。在Posix上,它只是一个文件描述符(int
),您可以在其上执行正常的read()
和write()
调用。recv()
和send()
上的某些选项。shutdown()
或close()
关闭Windows套接字。它类似于closesocket()
。必须有更多的差异,但这就是我现在能记住的。如果你想使用Winsocks进行移植,那么你将拥有一个小型库来关闭套接字,打印错误信息等等。
我可能会和boost::asio
人一起去(我从来没有用过它)。
答案 2 :(得分:2)
查看“自适应通信环境”(ACE)库: (ACE Home Page) 它在一个支持Windows,MacOS和Linux的便携式库中提供了一些很好的抽象和很多灵活性。 它有一点陡峭的学习曲线,但我从中获得了非常好的价值。
答案 3 :(得分:1)
老实说,我会先使用boost :: asio作为首选。如果你真的想要了解套接字API,你可以在Windows和Linux上使用标准的BSD风格的套接字API - 只是在Windows上你必须链接到(并初始化)Winsock2,而在Linux你不会有一个单独的库链接。
答案 4 :(得分:1)
你将使用多少套接字?我已经完成了几个应用程序,其中套接字的东西非常高(开放,读取,写入),并且从Windows到Linux完美地工作。如果不止于此 - 请加强。
答案 5 :(得分:1)
看看这个...... http://sourceforge.net/projects/cpp-sockets/