读书人

完成端口在一个连接下连续投递多个接收

发布时间: 2012-09-28 00:03:35 作者: rapoo

完成端口在一个连接上连续投递多个接收操作有问题么?
客户端与服务端建立了一条连接,如果服务端在这个连接上连续投递了多个接收操作,在这些操作还在等待数据时,客户端closesocket,这时这些接收操作都会返回,也就是GetQueuedCompletionStatus会返回很多次,导致一些业务逻辑被调用,但是客户端已经关闭连接了,数据都是无效的,有没有什么办法在客户端关闭连接后服务端在这个连接上投递的那些接收操作都无效掉?

顺便再问个问题:
完成端口启动后启动了五个工作线程,这时一个客户端连上了,服务端在这个连接上只投递一个接收操作,这时客户端发个包,五个线程中的一个线程接手处理这个包,如果这个线程需要30秒才能处理完这个包,如果在这个30秒内这个客户端又发了很多包,那服务端还能处理后来的包么?我在这个地方的疑问就是服务端只在这个连接上投递了一个接收操作,而这个操作已经在处理第一个包了,在没有继续投递接收操作的时候服务端还能接收后来的包么?

[解决办法]
1,服务器投递多个的接收请求是可以的,如果你关闭了客户端,GetQueuedCompletionStatus 依然有数据返回的话,需要你自己做出决定是处理还是不处理,在做出决定和处理后再将客户端分配的内存释放并且从完成端口移除即可

2,你启动了5个线程,有一个在处理30秒的数据,其他数据来是否接收看你的处理步骤
a,如果在处理数据前(30秒前)你投递了新的接收请求,那么后来的数据就应该能够获得
b,如果你在处理数据前没有投递请求这个情况就不好说了,要么系统帮你接收(看你之前是否多投递了接收请求)要么数据接收失败

针对第二个问题,你开辟的5个工作线程应该是负责接收数据,而需另开辟数据处理线程专门处理数据,这样收到数据后立刻提交给处理线程专门处理,这才是高效服务器的基本思路,否则...你懂的 呵呵

读书人网 >VC/MFC

热点推荐