文件传输C ++

时间:2012-04-27 09:38:11

标签: c++ file-transfer winsock2

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

这看起来完全没必要吗?

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

3 个答案:

答案 0 :(得分:2)

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

willblock错误要么是您为输出缓冲区发送了太多数据,要么尝试发送太快,并且远程缓冲区已满。这似乎可以再次发送,因为接收器收到它但没有足够的空间来存储它并让juste放弃它。

以下是一篇关于您的错误的小文章:Winsock error 10035

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

取自man-page

  

当消息不适合套接字的发送缓冲区时,   send()通常会阻塞,除非插入了套接字   非阻塞I / O模式。在非阻塞模式下,它会因错误而失败   在这种情况下,EAGAIN或EWOULDBLOCK。 select(2)电话可能是。{3}}   用于确定何时可以发送更多数据。