我在客户端使用IOCP,但是我发现在连接到服务器时使用阻塞调用更加方便。那么在使用IOCP时,使用阻塞的WSAConnect()
而不是非阻塞的ConnectEx()
是否存在问题?
我在客户端使用IOCP,但是我发现在连接到服务器时使用阻塞调用更加方便。那么在使用IOCP时,使用阻塞的WSAConnect()
而不是非阻塞的ConnectEx()
是否存在问题?
没问题。
调用WSAConnect
会阻塞线程直到连接被创建或者产生错误。之后,你可以使用异步IO,并通过应用程序IOCP获得有关已完成数据包的通知。但是IOCP不会提供有关WSAConnect
的任何数据包。
另一个要注意的点是,IOCP仅适用于重叠IO。如果你的函数没有消耗OVERLAPPED
结构体的任何内存位置(比如WSAConnect
),你可以确信IOCP不会与该API调用打交道。即使提供了OVERLAPPED
,也不意味着操作是异步的并且将在IOCP中发布。
你可能想看看C++的Boost.Asio
和C的libuv
。这样代码也将具有可移植性(而且不容易出错)。另一个有趣的平台是Microsoft的Casablanca
,它是跨平台的,但根据我的经验,性能非常差。
WSARecv()
并传递一个OVERLAPPED
结构而不接收完成数据包吗? - user6088487ReadFile
和WriteFile
将获取OVERLAPPED
,该结构指定从文件的哪个偏移量开始读取。在这种情况下,该操作将同步完成。 - David HaimOVERLAPPED
结构的函数。如果其中一个条件不适用,则 IOCP 将无法为该函数启动。 - David HaimWSAConnect()
仍然没有问题,对吗? - user6088487WSAConnect
没有使用OVERLAPPED
,因此IOCP不会监控它。但这个函数仍然可以正常工作。 - David Haim