完成端口下持续连接的后续请求接收问题

时间:2022-11-05 15:24:16
各位高手:
    假设我的完成端口模型应用程序的客户端连接上来后可能有持续请求,类似HTTP/1.1的保持连接,某次请求交互完成后,过一段随意时间,再次利用前面保持的套接字发送后续请求,如此直至它想中断或者服务端认为它空闲时间太久而把它kill掉。
    现在问题是服务端如何及时投递wsarecv来接收后续请求,我现在的做法是一次交互完成后马上又投递一次wsarecv(这样如果对方不发后续请求,这个接收就处于未完成状态),问题来了,当并发数大时由于每个空闲连接上都有未完成wsarecv,导致10055[
由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作]错误出现频率大大增大,有时还出现资源不足错误,请教如何改进程序已解决这个问题,总不至于每个套接字上注册FD_READ事件吧,那估计也太烦了,请各路高手指点迷津,我觉得能做到象HTTP服务器那样就行了。

10 个解决方案

#1


帮你up

#2


人呢?怎么没有人气?

#3


是否由于你的程序的资源不能及时释放引起的?

#4


post的WSARecv里的buflen设为0,不锁定内存页位

得到完成包后用同步调用接收数据

#5


你原来那个帖子上有人说起过啊, 就是 发起一个缓冲区为 0 的WSARECV. 返回后, 再用recv去读. 读到WSAEWOULDBLOCK就说明读完了. 记得先把SOCKET设置为非阻塞的.

#6


这样阻塞读会不会影响线程效率哦?还有当前套接字已经与完成端口关联,这时改成非阻塞的不会有影响?为什么不能还是调用wsarecv,只不过这时buflen不是0,这样不行吗?

#7


wsarecv可以是可以. 不过WSARECV还要先把结果传给IOCP, 再由IOCP分配给线程, 会不会有违效率的初衷?

#8


不对呀 buflen改为零 怎么客户端再一发数据 连接就断开了呢

#9


to z98431227:
  怎么说?不解

#10


呵呵 根据 starcbh说的:
post的WSARecv里的buflen设为0,不锁定内存页位

得到完成包后用同步调用接收数据

我按他这种方法做的 将WSABUF.len设为零,然后接受。
结果客户端往服务器端一发数据 连接就断开了

#1


帮你up

#2


人呢?怎么没有人气?

#3


是否由于你的程序的资源不能及时释放引起的?

#4


post的WSARecv里的buflen设为0,不锁定内存页位

得到完成包后用同步调用接收数据

#5


你原来那个帖子上有人说起过啊, 就是 发起一个缓冲区为 0 的WSARECV. 返回后, 再用recv去读. 读到WSAEWOULDBLOCK就说明读完了. 记得先把SOCKET设置为非阻塞的.

#6


这样阻塞读会不会影响线程效率哦?还有当前套接字已经与完成端口关联,这时改成非阻塞的不会有影响?为什么不能还是调用wsarecv,只不过这时buflen不是0,这样不行吗?

#7


wsarecv可以是可以. 不过WSARECV还要先把结果传给IOCP, 再由IOCP分配给线程, 会不会有违效率的初衷?

#8


不对呀 buflen改为零 怎么客户端再一发数据 连接就断开了呢

#9


to z98431227:
  怎么说?不解

#10


呵呵 根据 starcbh说的:
post的WSARecv里的buflen设为0,不锁定内存页位

得到完成包后用同步调用接收数据

我按他这种方法做的 将WSABUF.len设为零,然后接受。
结果客户端往服务器端一发数据 连接就断开了