为什么Windows需要withSocketsDo?

时间:2014-03-15 22:40:44

标签: sockets haskell

在Windows中,需要初始化套接字,如Networks

所示
  

在Windows操作系统上,必须先使用withSocketsDo初始化网络子系统,然后才能使用任何网络操作。例如

  main = withSocketsDo $ do {...}
     

虽然这在Windows平台上是非常必要的,但它在其他平台上是无害的,因此为了便于携带,最好始终使用它。

关于Windows的特别之处?

2 个答案:

答案 0 :(得分:8)

在现有版本的网络库中,withSocketsDo用于初始化Winsock library,这只是Windows上的一项要求。在其他平台上,没有库需要初始化,因此withSocketsDo什么都不做。

在网络库的未来版本中,withSocketsDo会自动调用,因此只需要包含它以与旧版本兼容,有关更改背后的详细信息,请参阅this blog post

答案 1 :(得分:4)

与其他平台不同,Windows需要通过手动初始化WinSock.dll来启动网络连接的进程。同时,与其他语言不同,Haskell在设计上没有全局可变状态。因此,WinSock初始化不能隐藏在库的加载内或创建某个单例对象,而是需要通过显式调用手动注册。