Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
C++ WSAConnect()与ConnectEx()的比较_C++_Sockets_Winapi_Winsock_Iocp - Fatal编程技术网

C++ WSAConnect()与ConnectEx()的比较

C++ WSAConnect()与ConnectEx()的比较,c++,sockets,winapi,winsock,iocp,C++,Sockets,Winapi,Winsock,Iocp,我在客户端使用IOCP,但我发现在连接到服务器时使用阻塞调用更方便。因此,在使用IOCP时,使用阻塞WSAConnect()而不是非阻塞ConnectEx()是否有任何问题?是的,这很好。 调用WSAConnect将阻止线程,直到创建连接/发生错误。然后,您可以使用应用程序IOCP执行异步IO并获取有关已完成数据包的通知。IOCP将不会提供任何有关WSAConnect的数据包 另一点是,IOCP与重叠IO一起异常工作。如果您的函数不使用任何OVERLAPPEDstruct(如WSAConnect

我在客户端使用IOCP,但我发现在连接到服务器时使用阻塞调用更方便。因此,在使用IOCP时,使用阻塞
WSAConnect()
而不是非阻塞
ConnectEx()
是否有任何问题?

是的,这很好。
调用
WSAConnect
将阻止线程,直到创建连接/发生错误。然后,您可以使用应用程序IOCP执行异步IO并获取有关已完成数据包的通知。IOCP将不会提供任何有关
WSAConnect
的数据包

另一点是,IOCP与重叠IO一起异常工作。如果您的函数不使用任何
OVERLAPPED
struct(如
WSAConnect
)的内存位置,则可以确保IOCP不会处理该API调用。即使提供了重叠,也不意味着操作是异步的,并且将在IOCP中发布


你可能想看看C++的代码> Boost。Asio < /C> >和 LIBUV C。代码也将是便携式的(而且不那么笨拙)。另一个有趣的平台是microsoft

Casablanca
,它是跨平台的,但在我的经验中,性能是灾难性的。

如果你想要同步I/O,为什么要使用IOCP?@Veronika Prüssels“@Mat如果我理解得很清楚,OP只是出于方便的原因关心连接被阻塞的调用。”是的,这就是我想要的。“@OP-Nothing阻止您将ConnectEx与阻塞未来混合,并承诺在仍然获得阻塞行为的情况下使用IOCP。”这意味着什么@Mat希望连接本身是同步的,读/写是异步的,这很好。是的,这很有意思,但在一些罕见的情况下,非最后一个是有意义的“即使提供了重叠,这并不意味着操作是异步的,并且将在IOCP中发布”您能否澄清一下您所说的意思。你的意思是我可以调用
WSARecv()
并向它传递一个
OVERLAPPED
结构而不接收完成数据包吗?例如,
ReadFile
WriteFile
获取
OVERLAPPED
从哪个种类开始读取文件的偏移量。如果没有为异步操作打开文件句柄,则该操作将同步完成。此外,您需要将句柄显式关联到IOCP,以便接收IO数据包。因此,为了使IOCP正常运行,您需要满足以下条件:1)具有支持异步IO的句柄2)将句柄与IOCP关联3)使用消耗重叠结构的函数。如果其中一个条件不适用,IOCP将不会启动该功能。我还有最后一个问题:如果我的套接字支持异步IO,并且我已将套接字与完成端口关联,在这种情况下,在套接字上使用阻塞
WSAConnect()
仍然没有问题,对吗?是的。正如我所说的,因为
WSAConnect
不使用
OVERLAPPED
IOCP根本不会使用它。该功能仍然可以正常工作。