Winsock 2可移植性 我将在C++中开发一些与套接字相关的东西,希望软件能在Windows和Linux之间尽可能地移植。 我看过不同的库,有一个C++,当然还有Boosi::asio。asio看起来很有前途,但对于这么小的应用程序来说,它将是一个很大的依赖项
这些东西值得我自己写,还是我应该使用图书馆?如果我自己做的话,主要的陷阱是什么?老实说,我会首选boost::asio。如果你真的想使用sockets API,你可以在Windows和Linux上使用标准的BSD样式的sockets API——只是在Windows上你必须链接(并初始化)Winsock2,而在Linux上你没有单独的库来链接。你将使用多少socket?我做过几个应用程序,其中socket的功能非常高级(开放、读、写),从Windows到Linux都能完美工作。如果不止这些,请使用boost。Winsocks与Posix套接字不太兼容:Winsock 2可移植性 我将在C++中开发一些与套接字相关的东西,希望软件能在Windows和Linux之间尽可能地移植。 我看过不同的库,有一个C++,当然还有Boosi::asio。asio看起来很有前途,但对于这么小的应用程序来说,它将是一个很大的依赖项,c++,winsock,portability,C++,Winsock,Portability,这些东西值得我自己写,还是我应该使用图书馆?如果我自己做的话,主要的陷阱是什么?老实说,我会首选boost::asio。如果你真的想使用sockets API,你可以在Windows和Linux上使用标准的BSD样式的sockets API——只是在Windows上你必须链接(并初始化)Winsock2,而在Linux上你没有单独的库来链接。你将使用多少socket?我做过几个应用程序,其中socket的功能非常高级(开放、读、写),从Windows到Linux都能完美工作。如果不止这些,请使用
- 在Winsocks中,套接字的类型为
。在Posix上,它只是一个文件描述符(socket
),您可以在其上执行正常的int
和read()
调用write()
- 它们不会以相同的方式返回错误
- 它们不支持
和recv()
上的某些选项send()
- 您必须使用两个特殊函数初始化和统一Winsocks库
- 我认为您无法使用
或shutdown()
关闭Windows套接字。它类似于close()
closesocket()
我可能会亲自使用
boost::asio
(虽然我从未使用过它)。我已经在插座周围开发了一些便携式包装器。确保你不会走上由WinSock2事件构成的不归路。除此之外,在我看来,最大的区别是:
- 要在Windows中启动网络,您需要调用
,要在Windows中关闭它,请运行::WSAStartup()
;在Linux中,什么都不做::WSACleanup()
- Linux中的
是Windows中的close()
closesocket()
- 驱动程序和操作系统的默认缓冲区大小不同,因此请确保使用
和so_RCVBUF
设置它们so_SNDBUF
- 因此_REUSEADDR在Windows上窃取地址,允许在Linux上频繁重新打开;您可能只想在Linux中使用此标志
- 使套接字非阻塞在Windows中使用
,在Linux中使用::ioctlsocket()
::fcntl()
- 头文件不同,
和Linux中的friends,
和Windows中的friends - 为了便于携带,最简单的方法可能是使用
等待数据到达::select()
s在Windows/Linux上完全不同;仅当您需要优化fdu集
s的初始化时,如添加/删除任意套接字时,这才相关fd_set
- 在Windows中,当套接字关闭时,任何挂在套接字上的线程都会被释放,并带有错误代码,而在Linux中,线程仍在等待。如果线程阻塞了套接字,例如“代码>::RevOfFor()/<代码>,您可以考虑使用<代码>:sDotoTo()/<代码>来释放Linux下的失速线程。
它的学习曲线有点陡峭,但我从中获得了很好的价值。看看这个 起初,它的级别很低,比如打开连接、写东西、读、退出。不过,它可能会扩展到包含Http内容。好吧,我看看我该怎么做。asio也有一个ICMP接口,非常好,所以现在看起来我会使用它。shutdown()是一个适用于Windows套接字的有效函数。需要使用closesocket()是否正确,尽管.closesocket只是windows版本的close,因此它们不必重载close函数。您不必关闭文件/套接字,但如果不关闭,可能会丢失数据。WSAGetLastError只是获取errno的windows函数,因为windows API不以相同的方式支持errno。对于套接字,POSIX支持读写的“发送”和“接收”版本。非常有用的建议。塔卡尔·奥赫·布加尔;)。看起来很有用。谢谢你,伙计。但它似乎相当古老,上一次更新是在2003年?但也许它仍然运作良好。