IOCP发送大数据的问题

telpor 2008-11-24 01:25:44
用IOCP做一个HTTP的SERVER,接收数据,处理完再把处理的数据发给客户端,关闭这个socket.
现在的问题是,当我投递了WSASend后(这里的数据比较大),会发生一个因这个WSASend而引起的通知消息,也就是说GetQueuedCompletionStatus会往下走,之后我去关闭这个socket.但客户端那边我看接收的进度条正在走,也就是说客户端还没接收完,当我调用close后,客户端那边马上就会知道服务端的关闭,而这时数据还没有收完呀,这怎么办?

也就是说投递一个大数据的WSASend,因这个WSASend而引起的通知消息,不能说明这些数据已经发送完了,那我怎么知道发送完了.
...全文
375 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lijianli9 2009-06-21
  • 打赏
  • 举报
回复
可以使用套接字选项中的,
LINGER lingerStruct;
lingerStruct.l_onoff = 0;
lingerStruct.l_linger = 1;
/************************************************************************/
/* 假如将S O _ L I N G E R设为零(换言之,l i n g e r结构的成员l _ o n o ff不为0,但l _ l i n g e r为0),便
不用担心c l o s e s o c k e t调用会进入“锁定”状态(等待完成),即使队列中的数据尚未发送,或
者尚未发出收到确认。我们称这种情况为“强行关闭”,或者“野蛮关闭”,因为套接字虚拟
通信回路会立即重设,尚未发出的所有数据都会丢失。而在远程端,正在运行的任何接收调
用都会失败,同时返回W S A E C O N N R E S E T错误。
如果在一个锁定套接字上,设置了S O _ L I N G E R,那么c l o s e s o c k e t调用也会在一个锁定套
接字上进入锁定或暂停状态,直到剩余的数据全部发出,或者超过规定的时间。我们将这称
为“从容关闭”。若超过规定的时间,数据仍未全部发出,Wi n d o w s套接字机制便会在
c l o s e s o c k e t返回之前,将连接中断。
*/
/************************************************************************/
setsockopt( clientSocket, SOL_SOCKET, SO_LINGER,
(char *)&lingerStruct, sizeof(lingerStruct) );
njdragonfly 2009-06-20
  • 打赏
  • 举报
回复
获得 发送完成消息 时,查看发送了多少字节,如果没有发送完成,则再调用WSASend操作,直到发送完成再closesoket
songtao_01 2009-06-19
  • 打赏
  • 举报
回复
客户端发个信息告诉服务端,我已经接收完毕,然后就能closesocket了
或者你看GetQUeueCompletionStatus发送了多少数据,然后累加,就知道发送了多少数据了
hendriclee 2009-06-19
  • 打赏
  • 举报
回复
crst_zh 2009-06-19
  • 打赏
  • 举报
回复
客户端接收完成,由客户端断开,服务器检测到客户端断开时再断开

或者客户端接收完成发回来一个通知,服务端收到这个通知再主动断开。
chenzhenxing 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 telpor 的回复:]
引用 9 楼 id27145 的回复:
引用 6 楼 telpor 的回复:
现像,比如发送20K,投递了WSASend后,GetQXXX那个往下走了,过过查找是发送20K的那个投递而发生的通知消息,但现在不能关闭这个socket,一关客户端那边马上就知道,但客户端当时还没有接收完这个20K的数据

知道是什么意思?
笨方法 客户端收完后发个消息回来 服务器再关


"知道"就是说,因为接收方正在接收,但还没有接收完,服务端一closesocket,接收方接收就…
[/Quote]

那该怎样解决呢? 如果用shutdown 话,他会一直阻塞.使效率变低.
如果用HasOverlappedIoCompleted 检察好像也有问题.有时候没有传完,他也说你传完了.
telpor 2008-11-25
  • 打赏
  • 举报
回复
还有就是投递的WSASend引起的通知返回的GetQueuedCompletionStatus第二个参数和发送的长度是相同的,这个没有问题,但客户端确实是没有接收完成
telpor 2008-11-25
  • 打赏
  • 举报
回复
在wsasend后,再绑一个消息,通知发送完成。


再绑一个消息,这个是什么消息?
telpor 2008-11-25
  • 打赏
  • 举报
回复
现像,比如发送20K,投递了WSASend后,GetQXXX那个往下走了,过过查找是发送20K的那个投递而发生的通知消息,但现在不能关闭这个socket,一关客户端那边马上就知道,但客户端当时还没有接收完这个20K的数据
caitian6 2008-11-25
  • 打赏
  • 举报
回复
学习
telpor 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 id27145 的回复:]
引用 6 楼 telpor 的回复:
现像,比如发送20K,投递了WSASend后,GetQXXX那个往下走了,过过查找是发送20K的那个投递而发生的通知消息,但现在不能关闭这个socket,一关客户端那边马上就知道,但客户端当时还没有接收完这个20K的数据

知道是什么意思?
笨方法 客户端收完后发个消息回来 服务器再关
[/Quote]

"知道"就是说,因为接收方正在接收,但还没有接收完,服务端一closesocket,接收方接收就出错了
id27145 2008-11-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 telpor 的回复:]
现像,比如发送20K,投递了WSASend后,GetQXXX那个往下走了,过过查找是发送20K的那个投递而发生的通知消息,但现在不能关闭这个socket,一关客户端那边马上就知道,但客户端当时还没有接收完这个20K的数据
[/Quote]
知道是什么意思?
笨方法 客户端收完后发个消息回来 服务器再关
tingtj 2008-11-24
  • 打赏
  • 举报
回复
在wsasend后,再绑一个消息,通知发送完成。
www.wantsoft.com上有例子
jourbin 2008-11-24
  • 打赏
  • 举报
回复
看看GetQueuedCompletionStatus返回的第2个参数,
检查一下已经传输的数据量是不是跟你想发送的数据量一样

象上面说的,socket也要对的上
id27145 2008-11-24
  • 打赏
  • 举报
回复
IOCP 有这样方法吗 关注下
用 GetQueuedCompletionStatus 取得后判断一下是不是这个socket
如果是不就说明操作完成了吗
telpor 2008-11-24
  • 打赏
  • 举报
回复
我现在是不知道什么时候已经发完了,好让我去close这个socket,而不是说我不知道要操作哪个socket
id27145 2008-11-24
  • 打赏
  • 举报
回复
用GetQueuedCompletionStatus 第三个参数 PULONG_PTR lpCompletionKey
在用CreateIoCompletionPort关联时设定ULONG_PTR CompletionKey
这样就知道是不是这个Socket了

18,356

社区成员

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

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