问个IOCP当中的WSASend的问题

phil2036 2009-03-29 11:56:43
比如说有这样的一个IOCP服务器,他接到client的连接以后就开始给client发送一个文件,每次都从文件里读4K的数据存到一个缓存里头,然后调用WSASend发送给client,如果文件很大需要很长时间才能发送完毕,但是在发送过程当中client由于某些原因断线,这个时候要怎么处理。

我试了下,即使断线WSASend也不会返回WSA_IO_PENDING以外的错误,但是线程池里头的GetQueuedCompletionStatus倒是会返回FALSE,用WSAGetLastError返回的错误也很怪,一个是64一个是995(我一共用了两个线程)。

这种WSASend的情况要如何处理,毕竟我要在WSASend完成的时候delete掉缓存,否则内存泄漏了
...全文
305 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
phil2036 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 WinEggDrop 的回复:]
引用楼主 phil2036 的帖子:
比如说有这样的一个IOCP服务器,他接到client的连接以后就开始给client发送一个文件,每次都从文件里读4K的数据存到一个缓存里头,然后调用WSASend发送给client,如果文件很大需要很长时间才能发送完毕,但是在发送过程当中client由于某些原因断线,这个时候要怎么处理。

我试了下,即使断线WSASend也不会返回WSA_IO_PENDING以外的错误,但是线程池里头的GetQueuedCompletionStatus倒是会返回FAL…
[/Quote]

对,就是这种情况,这种情况下没有什么办法来避免内存泄漏么?
phil2036 2009-03-30
  • 打赏
  • 举报
回复
尝试了一下发现几个问题
1.第一贴里提到的WSASend不返回错误是建立在直接将客户机在传送数据过程中把网线拔掉的情况下,如果调用closesocket那么WSASend会返回错误
2.如果在ERROR_NETNAME_DELETED把socket关掉(调用closesocket(...))那么不会返回ERROR_OPERATION_ABORTED

那么,
1.基于2,到底是应该忽略掉ERROR_NETNAME_DELETED而去等待ERROR_OPERATION_ABORTED发生时再去delete缓存然后把socket一并关掉还是在ERROR_NETNAME_DELETED发生时就去做掉这些事情
2.如何确保在WSASend时不会发生内存泄漏(特别是由于网络原因造成客户端掉线这种情况下)
phil2036 2009-03-30
  • 打赏
  • 举报
回复
查了下995是表示ERROR_OPERATION_ABORTED,那这个时候返回的lpCompletionKey和lpOverlapped是不是投递这次WSASend时用的那些值,然后64的那个ERROR_NETNAME_DELETED是什么东西?

我这样操作对不对,在返回995的时候把跟在OVERLAPPED后面的缓存删掉,然后在返回64的时候把client的socket调用closesocket关掉?
百事烟 2009-03-30
  • 打赏
  • 举报
回复
995: 由于线程退出或应用程序请求,已放弃 I/O 操作。
64: 指定的网络名不再可用。
WinEggDrop 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 phil2036 的帖子:]
比如说有这样的一个IOCP服务器,他接到client的连接以后就开始给client发送一个文件,每次都从文件里读4K的数据存到一个缓存里头,然后调用WSASend发送给client,如果文件很大需要很长时间才能发送完毕,但是在发送过程当中client由于某些原因断线,这个时候要怎么处理。

我试了下,即使断线WSASend也不会返回WSA_IO_PENDING以外的错误,但是线程池里头的GetQueuedCompletionStatus倒是会返回FALSE,用WSAGetLastError返回的…
[/Quote]

你是不是上一个WSASend()要发送的数据还没有在工作线程中收到完全发送的通知就已继续投递新的WSASend(),如果是的话,那么这种异常断线会令不少WSASend()挂起.如果只是投递一个WSASEnd(),那应该只有一个错误消息在工作线程中被返回.

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧