我想使用套接字发送文件,但几乎总是通过传输切断文件,但套接字从不发送异常,它只是不发送所有文件。
尝试解决此问题,即将文件的长度作为标题发送到服务器,因此它可以验证文件是否完整,如果不是,它会发回信号要求重新传输。
这样可行,但有时需要多达250次尝试才能很好地获取文件,¿您认为发生了什么?,我想到的是以较小的块发送文件,但是块的大小是多少?,
无法发送的文件大小为80kb,有时甚至是20kb的文件都失败了!。
任何提示?
答案 0 :(得分:1)
发送文件数据后,您可以使用Flush()方法强制发送所有本地缓冲数据
发送时,TCP将数据分成小包。
读取数据时,Read()方法返回一个整数,即实际读取的字节数 始终确保您要阅读的金额是读取的金额。
int actuallyRead = stream.Read(bufferToStoreData, 0, bytesToRead);
while (actuallyRead < bytesToRead) {
actuallyRead += stream.Read(bufferToStoreData, actuallyRead, bytesToRead - actuallyRead);
}
答案 1 :(得分:0)
看到这个帖子: Is there a way to block on a socket send() until we get the ack for that packet?
C#与任何其他套接字环境相同,如果要确保接收数据,则必须在应用程序级别进行某种确认。
Sender告诉接收者预期会有多少数据。接收器读取那么多字节并响应说&#34;我得到它&#34;。然后,发件人可以自由关闭它的连接或继续它的业务。如果发件人在收到&#34之前关闭,我就得到了#34;从收件人数据可能不会到达那里。
至于为什么你的应用级别的ack不起作用,发布一些代码,我们可以看一下。