首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用重叠命名管道的服务器:如何将GetOverlappedResult()与ReadFile()一起使用?

使用重叠命名管道的服务器:如何将GetOverlappedResult()与ReadFile()一起使用?
EN

Stack Overflow用户
提问于 2011-04-01 22:06:12
回答 1查看 2.3K关注 0票数 1

我已经编写了一个服务器和一个使用重叠命名管道的客户端。我的问题主要是Readfile()和GetOverlappedResult()。

注意,这个程序是一个测试代码。它稍后将集成到一个框架中(我正在将linux代码移植到使用AF_UNIX adress家族进行套接字连接的unix )。

我描述服务器部分。我有两条线:

1)主线程打开一个重叠的命名管道,然后在WaitForMultipleObjects()上循环。WaitForMultipleObjects()等待3个事件:第一个事件等待客户端连接。第二个允许我彻底退出这个项目。当一个操作在ReadFile()中挂起时,会发出第三个信号。

2)当客户端连接时,启动第二个线程。它遍历ReadFile()。

以下是服务器代码:

http://pastebin.com/5rka7dK7

我主要使用MSDN文档(使用重叠I/O的管道服务器,命名管道客户端)、SDK和internet上的其他文档来编写代码。查找1的客户端代码。客户端代码需要一些爱,但就目前而言,我的重点是使服务器完美地工作。

服务器代码中有4个函数(我忘记了显示错误消息的函数):

svr_new:它创建重叠命名管道和3个事件,并调用ConnectNamedPipe()

( b) svr_del释放所有资源

c) _read_data_cb:调用ReadFile()的线程

d) main()函数(主线程),它在WaitForMultipleObjects()上循环

我的目标是在_read_data_cb()中检测客户端断开连接(ReadFile()失败和GetLastError()返回ERROR_BROKEN_PIPE)以及数据何时来自客户端。

我不明白的是:

  • ,我应该打电话给GetOverlappedResult()?
  • ,如果是,在哪里?当ReadFile()失败并且GetLastError()返回ERROR_IO_PENDING (粘贴的第50行)时?当WaitForMultipleObjects()返回时(粘贴的第303行,我在那里注释了代码)?在其他地方?
  • ,当WaitForMultipleObjects()返回时,执行ReadFile()事件的ResetEvent (粘贴的第302行)。这里叫它对吗?

使用我粘贴的代码,如果客户端发送这24个字节( ReadFile()缓冲区大小为5字节),结果如下。我打算设置这个值,以测试如果客户端发送一些大于ReadFile()缓冲区的数据,该怎么办?

留言:“您好,客户!”

产出:

$ ./server.exe等待客户端..。WaitForMultipleObjects :0客户端连接(1) WaitForMultipleObjects :2* ReadFile :5 WaitForMultipleObjects :2* ReadFile :4

注意: WaitForMultipleObjects()可以被称为小于这一点,它似乎是随机的。

因此,在我的代码中,我不调用getOverlappedResult(),ReadFile()成功(il读取5*4 +4= 24字节),但我不知道读取操作何时完成。

注意:当ReadFile()与ERROR_IO_PENDING一起失败时,我添加了printf(),即printf()被无限期调用。

此外,客户端发送2条消息。上面的那个,3秒后的另一个。第二条消息永远不会被读取,ReadFile()在错误ERROR_SUCCESS中失败.(准确地说,ReadFile()返回FALSE,GetLastError()返回ERROR_SUCCESS)

所以我完全迷路了。我在Internet、MSDN、SDK代码(Server32.c和Client32.c)中搜索了几个小时。在我的具体情况下,我仍然不知道该怎么办。

那么,有人能解释我如何使用GetOverlappedResult() (如果我必须使用它)来知道如何检查读取操作是否完成,以及在哪里?甚至,如果有人能修复我的代码:-)我给出了代码以便每个人都可以测试它(我在互联网上找到了很多文档,但它几乎总是不精确:-/ )

谢谢

1

EN

回答 1

Stack Overflow用户

发布于 2011-04-01 22:44:17

看看I/O完成端口。在我看来,这是接收和处理Windows中有关重叠操作的通知的最有效方法。因此,在准备处理新的完成事件时,基本上需要在阻塞和非阻塞模式中使用GetQueuedCompletionStatus和GetQueuedCompletionStatusEx,而不是不时调用GetOverlappedResult。事实上,您甚至可以完全摆脱WaitForMultipleObjects。

另外,你的目标是哪种口味的Unix?在Solaris中有一个非常类似的抽象。看看男人port_create。

不幸的是,Linux中没有类似的东西。信号(包括实时信号)在某种程度上可以用作可等待的完成对象,但它们不像Windows和Solaris中的端口那样全面。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5519361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档