gpt4 book ai didi

c++ - WSASend 在大文件传输过程中失败是否正常?

转载 作者:搜寻专家 更新时间:2023-10-31 00:22:04 24 4
gpt4 key购买 nike

如果有人有时间,我需要一点帮助。我已经使用 IO 完成端口编写了一个 Web 服务器,但是我在发送大文件时遇到了一些问题。网页似乎加载正常,但在大文件传输期间,WSASend() 会在几分钟后失败并出现错误“指定的网络名称不再可用。”

现在,我的服务器只是在任何重叠操作失败时关闭关联的连接。这是正确的做法吗?或者我应该在关闭套接字之前重试几次失败的重叠操作?我正在使用 tcp/stream 套接字。

(已修复)我还从 WSARecv 接收到看似随机的 0 字节数据包。我不确定该怎么做,或者问题是否相关。(/fixed)

感谢您的帮助

编辑:现在服务器可以正确处理连接,并且有更全面的日志,看来 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 字节,并且仅在第一个 block 完成后才发送下一个 block 。

再次感谢您对此的任何想法。

附注我什至刚刚实现了一个重试功能,这样它会在放弃之前重试失败的重叠 IO 操作五次....仍然没有运气 =(

最佳答案

recv 返回的零长度数据包表示另一端的客户端已关闭连接。
这回答了为什么您随后的发送到客户端失败。

http://www.opengroup.org/onlinepubs/009695399/functions/recv.html

If no messages are available to be received and the peer has performed an orderly shutdown, recv() shall return 0.

关于c++ - WSASend 在大文件传输过程中失败是否正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3740149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com