C++ 如何在Windows中将套接字设置为阻止模式?

C++ 如何在Windows中将套接字设置为阻止模式?,c++,networking,sockets,winsock,C++,Networking,Sockets,Winsock,我正在做一些相当简单的跨平台TCP套接字编程。不幸的是,我发现在Windows上编译时,默认情况下我的套接字是非阻塞的,而在OSX上,默认情况下它们是阻塞的。如何在Windows上强制套接字进入阻塞模式?它们通常默认为非阻塞模式,还是出现了严重问题 我的代码部分基于以下简单示例: 我相信可能会有帮助;特别要注意的是 虽然封锁了 Windows支持套接字 插座,它们的用途非常广泛 气馁。程序员是谁 约束为使用阻塞模式-- 例如,作为现有项目的一部分 要移植的应用程序-- 应该了解 Windows中

我正在做一些相当简单的跨平台TCP套接字编程。不幸的是,我发现在Windows上编译时,默认情况下我的套接字是非阻塞的,而在OSX上,默认情况下它们是阻塞的。如何在Windows上强制套接字进入阻塞模式?它们通常默认为非阻塞模式,还是出现了严重问题

我的代码部分基于以下简单示例:

我相信可能会有帮助;特别要注意的是

虽然封锁了 Windows支持套接字 插座,它们的用途非常广泛 气馁。程序员是谁 约束为使用阻塞模式-- 例如,作为现有项目的一部分 要移植的应用程序-- 应该了解 Windows中的阻止操作 插座


如果您完全了解所列出的无数问题,并且发现处理所有这些问题比设计适合Windows的程序更可取,而不是成为Unix发出半哔哔声的端口,请直接调用cmd参数设置为FIONBIO,第三个参数指向值为0的长单词。但是,不要说你没有被警告;-)

否,Windows上默认情况下,普通的旧BSD样式套接字不是非阻塞的。请参见中的示例


如果您使用MFC及其CAsyncSocket mess,那么是的,它都是非阻塞的,但这是一个。

那么windows程序员通常会创建无限循环来不断轮询recv和其他函数吗?不,异步I/O(特别是网络)编程通常是通过回调或事件完成的,最明显的不是轮询,正因为如此,它的效率非常高。winsock遵循古老的WinAPI传统,因此它使用消息而不是回调。或者,代替选择,你使用并从此快乐地生活;-)。例如,connect返回
SOCKET\u ERROR
,您通过WSAGetLastError检查并获得一个WSAEWOULDBLOCK,然后当您WSAAsyncSelect w/对连接感兴趣时,您将在准备就绪时获得一个
FD\u connect
,等等。进一步注意,对winsock的编程权限会使您的大脑弯曲:Python的扭曲,MFC的CAsyncSocket(),ACE(cfr),等等,等等,所有这些都为Windows异步IO方法提供了同样强大和更高级别(更易于使用;-)的异步/基于事件的API(许多具有跨平台优势,如出色的vigorish;-)。抱歉,但是-1引用了Windows 3.1(!)16位源代码。这一系列的Windows版本被Windows 95系列所取代,而Windows 95系列自那时起就被取代了。看看上面的日期:1993年!今天的Windows是先发制人的,它带走了主要的阻塞关注点。winsock标记向我表明OP想要了解winsock,所以这就是我的回答(虽然建议不要编程到winsock,而是编程到更高的抽象层,如Twisted、MFC或ACE:当然,这些框架将使用安装在特定系统上的最佳实现)。