【问题标题】:How to set sockets to blocking mode in Windows?如何在 Windows 中将套接字设置为阻塞模式?
【发布时间】:2010-11-24 02:21:50
【问题描述】:

我正在做一些相当简单的跨平台 TCP 套接字编程。不幸的是,我发现在 Windows 上编译时,我的套接字默认是非阻塞的,而在 OS X 上它们默认是阻塞的。如何在 Windows 上强制套接字进入阻塞模式?他们通常默认为非阻塞模式还是有什么严重的错误?

我的代码部分基于以下简单示例: http://cs.baylor.edu/~donahoo/practical/CSockets/code/TCPEchoClient.c http://cs.baylor.edu/~donahoo/practical/CSockets/code/TCPEchoServer.c

【问题讨论】:

    标签: c++ networking sockets winsock


    【解决方案1】:

    不,普通的旧 BSD 样式套接字在 Windows 上默认是非阻塞的。请参阅Winsock Programmer's FAQ 中的示例。

    如果你使用 MFC 和它的 CAsyncSocket 混乱,那么是的,它都是非阻塞的,但那是 separate issue

    【讨论】:

      【解决方案2】:

      我相信this reference 可能会有所帮助;请特别注意,

      虽然阻塞操作 Windows 下支持套接字 套接字,它们的使用是强烈的 灰心。程序员是谁 受限于使用阻塞模式—— 例如,作为现有的一部分 要移植的应用程序—— 应该注意语义 Windows 中的阻塞操作 套接字。

      如果您完全了解 here 中列出的无数问题,并且发现处理所有这些问题比设计您的程序以适应 Windows 更可取,而不是半声 ed 来自 Unix 的端口,继续使用 ioctlsocket 调用,其中 cmd 参数设置为 FIONBIO,第三个参数指向一个值为 0 的长字。但是,不要说你没有被警告;-)。

      【讨论】:

      • 那么windows程序员通常会创建无限循环来不断轮询recv和其他函数吗?这似乎非常低效。
      • 不,异步 I/O(尤其是网络)编程通常是通过回调或事件完成的,绝对是 NOT 轮询,正因为如此,它非常有效。 winsock 是古老的 Win API 传统,因此它使用消息而不是回调。或者,您可以使用sockets.com/winsock.htm#Windows_AsyncSelect 而不是选择,然后从此过上幸福的生活;-)。例如,连接返回SOCKET_ERROR,您使用 WSAGetLastError 检查并获得一个 WSAEWOULDBLOCK,然后当您对连接感兴趣时使用 WSAAsyncSelect,您将在准备好时获得一个FD_CONNECT - 等等。
      • 进一步注意,对 winsock 进行编程可能会使您的大脑弯曲:Python 的 Twisted、MFC 的 CAsyncSocket (msdn.microsoft.com/en-us/library/3tbz7kf5(VS.80).aspx)、ACE (cfr artima.com/articles/io_design_patterns.html) 等等,都提供了同样强大和更高的功能——级别(更易于使用;-)基于异步/事件的 API 到 Windows 异步 IO 方法(许多具有跨平台优势作为一种很好的活力;-)。
      • 对不起,-1 用于引用 Windows 3.1 (!) 16 位源。整个 Windows 版本系列都被 Windows 95 系列所取代,而后者本身也已被取代。看看上面的日期:1993!今天的 Windows 是先发制人的,它消除了主要的阻塞问题
      • winsock 标记向我表明 OP 想了解有关 winsock 的信息,所以这就是我的回答(同时建议不要对 winsock 进行编程,而是对更高的抽象层进行编程,例如 Twisted、MFC 或 ACE:当然,这些框架将使用它们所安装的特定系统上可用的最佳实现)。
      猜你喜欢
      • 2011-01-10
      • 1970-01-01
      • 2011-12-19
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2010-10-26
      • 1970-01-01
      相关资源
      最近更新 更多