Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winsock 2可移植性 我将在C++中开发一些与套接字相关的东西,希望软件能在Windows和Linux之间尽可能地移植。 我看过不同的库,有一个C++,当然还有Boosi::asio。asio看起来很有前途,但对于这么小的应用程序来说,它将是一个很大的依赖项_C++_Winsock_Portability - Fatal编程技术网

Winsock 2可移植性 我将在C++中开发一些与套接字相关的东西,希望软件能在Windows和Linux之间尽可能地移植。 我看过不同的库,有一个C++,当然还有Boosi::asio。asio看起来很有前途,但对于这么小的应用程序来说,它将是一个很大的依赖项

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都能完美工作。如果不止这些,请使用

这些东西值得我自己写,还是我应该使用图书馆?如果我自己做的话,主要的陷阱是什么?

老实说,我会首选boost::asio。如果你真的想使用sockets API,你可以在Windows和Linux上使用标准的BSD样式的sockets API——只是在Windows上你必须链接(并初始化)Winsock2,而在Linux上你没有单独的库来链接。

你将使用多少socket?我做过几个应用程序,其中socket的功能非常高级(开放、读、写),从Windows到Linux都能完美工作。如果不止这些,请使用boost。

Winsocks与Posix套接字不太兼容:

  • 在Winsocks中,套接字的类型为
    socket
    。在Posix上,它只是一个文件描述符(
    int
    ),您可以在其上执行正常的
    read()
    write()
    调用
  • 它们不会以相同的方式返回错误
  • 它们不支持
    recv()
    send()
    上的某些选项
  • 您必须使用两个特殊函数初始化和统一Winsocks库
  • 我认为您无法使用
    shutdown()
    close()
    关闭Windows套接字。它类似于
    closesocket()
肯定有更多的不同,但这就是我现在能记得的。如果您想要Winsocks的可移植性,您将有一个小型库用于关闭套接字、打印错误消息等


我可能会亲自使用
boost::asio
(虽然我从未使用过它)。

我已经在插座周围开发了一些便携式包装器。确保你不会走上由WinSock2事件构成的不归路。除此之外,在我看来,最大的区别是:

  • 要在Windows中启动网络,您需要调用
    ::WSAStartup()
    ,要在Windows中关闭它,请运行
    ::WSACleanup()
    ;在Linux中,什么都不做
  • Linux中的
    close()
    是Windows中的
    closesocket()
  • 驱动程序和操作系统的默认缓冲区大小不同,因此请确保使用
    so_RCVBUF
    so_SNDBUF
    设置它们
  • 因此_REUSEADDR在Windows上窃取地址,允许在Linux上频繁重新打开;您可能只想在Linux中使用此标志
  • 使套接字非阻塞在Windows中使用
    ::ioctlsocket()
    ,在Linux中使用
    ::fcntl()
  • 头文件不同,
    和Linux中的friends,
    和Windows中的friends
  • 为了便于携带,最简单的方法可能是使用
    ::select()
    等待数据到达
  • fdu集
    s在Windows/Linux上完全不同;仅当您需要优化
    fd_set
    s的初始化时,如添加/删除任意套接字时,这才相关
  • 在Windows中,当套接字关闭时,任何挂在套接字上的线程都会被释放,并带有错误代码,而在Linux中,线程仍在等待。如果线程阻塞了套接字,例如“代码>::RevOfFor()/<代码>,您可以考虑使用<代码>:sDotoTo()/<代码>来释放Linux下的失速线程。
我所需要的所有其他东西都来自låda。

看看“自适应通信环境”(ACE)库: 它提供了一些很好的抽象和很多灵活性,所有这些都集中在一个支持Windows、MacOS和Linux的可移植库中。
它的学习曲线有点陡峭,但我从中获得了很好的价值。

看看这个

起初,它的级别很低,比如打开连接、写东西、读、退出。不过,它可能会扩展到包含Http内容。好吧,我看看我该怎么做。asio也有一个ICMP接口,非常好,所以现在看起来我会使用它。shutdown()是一个适用于Windows套接字的有效函数。需要使用closesocket()是否正确,尽管.closesocket只是windows版本的close,因此它们不必重载close函数。您不必关闭文件/套接字,但如果不关闭,可能会丢失数据。WSAGetLastError只是获取errno的windows函数,因为windows API不以相同的方式支持errno。对于套接字,POSIX支持读写的“发送”和“接收”版本。非常有用的建议。塔卡尔·奥赫·布加尔;)。看起来很有用。谢谢你,伙计。但它似乎相当古老,上一次更新是在2003年?但也许它仍然运作良好。