如果有人有时间,我需要一点帮助。我已经使用 IO 完成端口编写了一个 Web 服务器,但是在发送大文件时遇到了一些问题。网页似乎可以正常加载,但在大文件传输期间,WSASend() 会在几分钟后失败,并出现错误“指定的网络名称不再可用”。
现在,当任何重叠操作失败时,我的服务器只会关闭关联的连接。这是正确的做法吗?或者我应该在关闭套接字之前重试失败的重叠操作几次?我正在使用 tcp/stream 套接字。
(已修复)我还收到了来自 WSARecv 的随机 0 字节数据包。我不知道该怎么做,或者问题是否相关。(/已修复)
谢谢你的帮助
编辑:现在服务器正确处理连接,并且有一个更全面的日志,看起来 Len 是对的。客户端出于某种原因正在关闭连接。
日志:
Initializing Windows Sockets...
Forwarding port 80...
Starting server...
Waiting for incoming connections...
Socket 1128: Client connected.
Socket 1128: Request received
Socket 1128: Sent response
Socket 1128: Error 64: SendChunk() failed. //WSASend()
Socket 1128: Closing connection - GetQueueCompletionStatus == FALSE
所以现在的问题是,为什么客户端会关闭连接?它需要 2-5 分钟才能发生。我已将每次发送的缓冲区大小减少到 4098 字节,并且仅在第一个块完成时才发送下一个块。
再次感谢您对此的任何想法。
ps 我什至刚刚实现了一个重试功能,这样它就会在放弃之前重试失败的重叠 IO 操作五次......仍然没有运气=(