Socket发送截断信息

本文关键字:信息 Socket | 更新日期: 2023-09-27 18:17:07

我尝试使用套接字发送文件,但几乎总是在传输过程中切断文件,但套接字从不发送异常,它只是不发送所有文件。

为了解决这个问题,我将文件的长度作为头发送给服务器,这样它就可以验证文件是否完整,如果没有,它会发送一个信号请求重传。

这是有效的,但有时需要多达250次尝试才能获得文件,你认为发生了什么?,我想以较小的块发送文件,但是块的大小是多少呢?

发送失败的文件大小为80kb,有时甚至20kb的文件也会失败!

提示吗?

Socket发送截断信息

发送文件数据后,您可以使用Flush()方法强制发送所有本地缓冲数据。
在发送时,TCP将数据分成小的数据包。

读取数据时,Read()方法返回一个整数,表示实际读取的字节数。

int actuallyRead = stream.Read(bufferToStoreData, 0, bytesToRead);
while (actuallyRead < bytesToRead) {
    actuallyRead  += stream.Read(bufferToStoreData, actuallyRead, bytesToRead - actuallyRead);
}

看这个线程:是否有一种方法可以阻塞套接字send(),直到我们得到该数据包的ack ?

对于c#和任何其他套接字环境都是一样的,如果你想确保数据的接收,你必须在应用程序级别做某种确认。

发送方告诉接收方期望得到多少数据。接收方读取这么多字节,并响应说"我收到了"。然后发件人可以自由地关闭连接或继续其业务。如果发送方在收到接收方的"i got it"之前关闭,数据可能不会到达那里。

至于为什么你的应用程序级别不工作,张贴一些代码,我们可以看看它