2

当我的客户端向服务器发送文件时,我应该在发送下一个块之前休眠(100)左右以确保服务器有足够的时间下载+写入数据吗?

这似乎完全没有必要吗?

另外,我在发送块时遇到了会阻塞错误(#10035),所以我只是循环发送直到它成功,如果发送 == SOCKET_ERROR goto SendAgain; , 那样行吗?

4

3 回答 3

2

在我看来,使用 sleepfunction 等待某事完成在 99% 的情况下都是错误的。您现在永远不会有您需要或您期望执行一个进程的时间(可能会被例如尖峰、i/o 中的其他问题或其他问题中断)

如果您想确保完全执行重要的事情,您应该阅读信号量或类似的东西,您可以在开始/结束时锁定/释放进程。

于 2012-04-27T10:26:18.853 回答
2

如果您通过 TCP 发送文件,那么它是确保已收到所有内容的协议,我不会在每个块之间放置睡眠。

willblock 错误是您为输出缓冲区发送了太多数据,或者您尝试发送太快,并且远程缓冲区已满。再次发送它似乎没问题,因为接收者收到了它,但没有足够的空间来存储它并且只是丢弃它。

这是一篇关于您的错误的小文章:Winsock 错误 10035

于 2012-04-27T09:54:47.483 回答
0

取自手册页

当消息不适合套接字的发送缓冲区时,send() 通常会阻塞,除非套接字已被置于非阻塞 I/O 模式。在非阻塞模式下,它会因错误 EAGAIN 或 EWOULDBLOCK 而失败。select(2)调用可用于确定何时可以发送更多数据。

于 2012-04-27T10:54:47.563 回答