热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:AcceptEx()同步完成?

篇首语:本文由编程笔记#小编为大家整理,主要介绍了AcceptEx()同步完成?相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了AcceptEx()同步完成?相关的知识,希望对你有一定的参考价值。



我正在使用IO完成端口和AcceptEx(),同时了解服务器,并正在研究Len Holgate的免费服务器框架来做到这一点。他有以下代码:

// Basically calls AcceptEx() via a previously obtained function pointer
if (!CMSWinSock::AcceptEx(
m_listeningSocket,
pSocket->m_socket,
reinterpret_cast(const_cast(pBuffer->GetBuffer())),
bufferSize,
sizeOfAddress,
sizeOfAddress,
&bytesReceived,
pBuffer))
{
const DWORD lastError = ::WSAGetLastError();
if (ERROR_IO_PENDING != lastError)
{
Output(_T("CSocketServerEx::Accept() - AcceptEx: ") + GetLastErrorMessage(lastError));
pSocket->Release();
pBuffer->Release();
}
}
else
{
// Accept completed synchronously. We need to marshal the data recieved over to the
// worker thread ourselves...
m_iocp.PostStatus((ULONG_PTR)m_listeningSocket, bytesReceived, pBuffer);
}

我很困惑“同步接受完成”其他情况。我已多次尝试使这个代码路径被命中(通过在发出AcceptEx之前暂停代码,连接,然后恢复代码),但每当我尝试调用总是失败时使用ERROR_IO_PENDING并且我得到了我的通知包。此外,我读过this MS knowledgebase article(我可能误解了)



此外,如果Winsock2 I / O调用返回SUCCESS或IO_PENDING,则可确保在I / O完成时完成数据包将排队到IOCP


但是,我认为这不适用于AcceptEx(),因为dox为AcceptEx()状态的参数lpdwBytesReceived



仅当操作同步完成时才设置此参数。


所以它似乎可以同步完成...有人能告诉我AcceptEx()如何同步完成(即我如何在我的服务器中复制它?)


答案


此外,如果Winsock2 I / O调用返回SUCCESSERROR_IO_PENDING,则可确保在I / O完成时完成数据包将排队到IOCP


如果完成端口与文件关联,则适用于任何I / O请求。但是从windows vista开始,这也取决于notification mode设置的文件句柄。

但首先需要从本机视图开始。

默认情况下,如果未设置FILE_SKIP_COMPLETION_PORT_ON_SUCCESS,则返回NTSTATUS status存在3个案例:



  1. NT_SUCCESS(status)status >= 0 - 将完成

  2. NT_ERROR(status)status >= 0xc0000000 - 将无法完成

  3. NT_WARNING(status) or status <0xc0000000 - 不清楚 - 如果来自I / O经理的这个错误(比如 - STATUS_DATATYPE_MISALIGNMENT - 将不会完成)。如果来自驱动程序的这个错误(比如STATUS_NO_MORE_FILES - 将完成)。

在这种情况下,win32层通常单独检查STATUS_PENDING并返回ERROR_IO_PENDING(但存在和例外,如ReadDirectoryChangesW)。否则,如果NT_ERROR(status) api返回失败并设置错误代码。否则返回成功。可见那个案例NT_WARNING(status)认为是成功的,但在这种情况下,如果来自I / O管理器的错误,将无法完成。如果参数不正确,I / O通常会从NT_ERROR(status)范围返回错误。只有我知道的情况(对于异步api) - 当I / O管理器具有关于缓冲区对齐的特殊知识时,可以在错误的对齐缓冲区的情况下返回STATUS_DATATYPE_MISALIGNMENT。在NtNotifyChangeDirectoryFileReadDirectoryChangesW for win32)或NtQueryDirectoryFile(没有相应的win32 api)。所以只有我知道什么时候才能完成的情况,当win32返回成功时 - 用未对齐的lpBuffer调用ReadDirectoryChangesW(它必须是DWORD对齐的) - 在这种情况下,I / O管理器只返回STATUS_DATATYPE_MISALIGNMENT但是win32层将此解释为成功代码并且返回true。但在这种情况下将无法完成。但这种情况很少发生,您可能需要使用错误的对齐结构。所以一般是的:

默认情况下,如果I / O调用返回SUCCESSERROR_IO_PENDING将排队到端口的完成条目。 (我尝试描述的特殊例外情况)

如果我们在文件对象上设置FILE_SKIP_COMPLETION_PORT_ON_SUCCESS(注意这是每个文件对象但不是每个文件句柄 - 文档不完全在这里)都变得更加简单和高效 - 完成条目将排队到端口 - 当且仅当I / O请求时返回STATUS_PENDING。来自win32视图的ERROR_IO_PENDING(除了ReadDirectoryChangesW(可能是其他一些api?),其中win32层只是丢失了返回代码信息)



但是,我认为这不适用于AcceptEx()


你错了这个,我怎么说,适用于任何io请求。 “仅当操作同步完成时才设置此参数。” - 等等什么?



如果查看代码片段,清除可见代码假设 - 如果AcceptEx完成同步并且没有发生错误 - 将不会完成。或SetFileCompletionNotificationModes(m_listeningSocket, FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)调用或代码是错误的 - 将在这种情况下完成io并且不需要m_iocp.PostStatus - 这将是致命的错误。但我怀疑代码使用FILE_SKIP_COMPLETION_PORT_ON_SUCCESS - 所以它错了。但错误从未提出因为AcceptEx(强调ioctl)的驱动程序端实现永远不会返回STATUS_SUCCESS:它检查参数 - 如果错误 - 只返回一些错误,否则总是返回STATUS_PENDING。因此,对于异步套接字,AcceptEx永远不会返回true,代码永远不会跳转到错误的其他情况。但无论如何代码是错误的。我认为设计不是最好的 - 如果我们确定将不会完成 - 更好的只是直接调用完成例程与返回的错误代码而不是Release()(这将在完成例程中完成)或PostStatus - 为什么帖子?! - 直接打电话。





AcceptEx()如何同步完成


非常简单 - 如果m_listeningSocket处理同步文件对象。但是在这种情况下,您无法将IOCP绑定到文件(它只能在异步文件对象的情况下绑定)。



关于lpdwBytesReceived参数 - 系统复制Information成员IO_STATUS_BLOCK或如果想要OVERLAPPED.InternalHigh,以防操作刚刚完成。如果挂起返回 - 这些数据根本没有准备好,也没有填写。你有完成后io返回的实际字节数



推荐阅读
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
author-avatar
手机用户2502861123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有