2012-04-27 53 views
2

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

这似乎完全没有必要吗?

另外我发送一个块时会发生blockblock错误(#10035),所以我只是循环发送,直到它成功,如果发送== SOCKET_ERROR goto SendAgain; , 这可以吗?

+3

如果你正在使用的块错误是循环,你为什么要摆在首位使用非阻塞套接字在做什么? – Sven 2012-04-27 10:02:16

+0

阅读关于Select – user1348950 2012-04-27 11:15:23

+0

的最新评论如果套接字不处于非阻塞模式,那么'send'不应该返回一个封锁错误,它应该在这种情况下阻塞。 – Sven 2012-04-27 13:16:52

回答

2

如果你通过TCP发送你的文件,那么它是确保所有东西都被接收到的协议,我不会在每个块之间进行睡眠。

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

这里是你的错误的小文章:Winsock error 10035

+0

所以,如果这是任何原因,循环发送工作正常吗?如何在本地一切都很好,但远程似乎我会放下一些数据 – user1348950 2012-04-27 10:48:45

+0

如果缓冲区已满并且有些数据被丢弃,您可能无法以正确的顺序接收数据。您可以在发送实际文件之前添加您发送的文件的校验和(SHA-1/MD5/...)。最后你可以确定收到了正确的整个文件。 – Uflex 2012-04-27 10:58:26

+0

我知道我正在丢失数据,因为文件大小比较小,图标不存在,文件无法打开等。我该如何防止数据被丢弃? – user1348950 2012-04-27 11:14:37

2

在使用sleepfunction等待事情做了我的意见是在99%的时间出现在错误的方式。 你现在从来没有时间你需要或者你期望一个进程被执行(可以被例如尖峰,I/O或其他问题打断)

如果你想确定一些重要的东西完全执行你应该阅读关于信号量或类似的东西,在开始/结束时锁定/释放进程。

+0

我会研究一下,我想找一个睡眠替代品,谢谢。 – user1348950 2012-04-27 10:42:44

+0

不客气。如果您想了解更多关于这种流程处理的知识,那么优先级调度的主题应该引起您的兴趣。 – 2012-04-27 11:58:11

0

man-page摘自:

When the message does not fit into the send buffer of the socket, send() normally blocks, unless the socket has been placed in nonblocking I/O mode. In nonblocking mode it would fail with the error EAGAIN or EWOULDBLOCK in this case. The select(2) call may be used to determine when it is possible to send more data.