C++ WSAConnect()与ConnectEx()的比较
我在客户端使用IOCP,但我发现在连接到服务器时使用阻塞调用更方便。因此,在使用IOCP时,使用阻塞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
WSAConnect()
而不是非阻塞ConnectEx()
是否有任何问题?是的,这很好。调用
WSAConnect
将阻止线程,直到创建连接/发生错误。然后,您可以使用应用程序IOCP执行异步IO并获取有关已完成数据包的通知。IOCP将不会提供任何有关WSAConnect
的数据包
另一点是,IOCP与重叠IO一起异常工作。如果您的函数不使用任何OVERLAPPED
struct(如WSAConnect
)的内存位置,则可以确保IOCP不会处理该API调用。即使提供了重叠,也不意味着操作是异步的,并且将在IOCP中发布
你可能想看看C++的代码> Boost。Asio < /C> >和
,它是跨平台的,但在我的经验中,性能是灾难性的。Casablanca
WSARecv()
并向它传递一个OVERLAPPED
结构而不接收完成数据包吗?例如,ReadFile
和WriteFile
获取OVERLAPPED
从哪个种类开始读取文件的偏移量。如果没有为异步操作打开文件句柄,则该操作将同步完成。此外,您需要将句柄显式关联到IOCP,以便接收IO数据包。因此,为了使IOCP正常运行,您需要满足以下条件:1)具有支持异步IO的句柄2)将句柄与IOCP关联3)使用消耗重叠结构的函数。如果其中一个条件不适用,IOCP将不会启动该功能。我还有最后一个问题:如果我的套接字支持异步IO,并且我已将套接字与完成端口关联,在这种情况下,在套接字上使用阻塞WSAConnect()
仍然没有问题,对吗?是的。正如我所说的,因为WSAConnect
不使用OVERLAPPED
IOCP根本不会使用它。该功能仍然可以正常工作。