C#套接字发送截断信息

C#套接字发送截断信息,c#,sockets,C#,Sockets,我尝试使用套接字发送文件,但它几乎总是在传输过程中剪切文件,但套接字从不发送异常,它只是不发送所有文件 试图解决这个问题,im将文件的长度作为头发送到服务器,这样它就可以验证文件是否完整,如果不完整,它将发送一个请求重新传输的信号 这是可行的,但有时需要250次尝试才能获得好的文件,“你认为发生了什么事?”我想以较小的块发送文件,但块的大小合适吗 无法发送的文件大小为80kb,有时甚至20kb的文件也会失败 任何提示?发送文件数据后,可以使用Flush()方法强制发送所有本地缓冲数据。 发送时,

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

试图解决这个问题,im将文件的长度作为头发送到服务器,这样它就可以验证文件是否完整,如果不完整,它将发送一个请求重新传输的信号

这是可行的,但有时需要250次尝试才能获得好的文件,“你认为发生了什么事?”我想以较小的块发送文件,但块的大小合适吗

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


任何提示?

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

读取数据时,Read()方法返回一个整数,即实际读取的字节数。
始终确保您打算读取的量是已读取的量

int actuallyRead = stream.Read(bufferToStoreData, 0, bytesToRead);
while (actuallyRead < bytesToRead) {
    actuallyRead  += stream.Read(bufferToStoreData, actuallyRead, bytesToRead - actuallyRead);
}
int actuallyRead=stream.Read(bufferToStoreData,0,bytesToRead);
while(实际读取
查看此线程:

对于C#和任何其他套接字环境一样,如果要确保数据的接收,必须在应用程序级别进行某种确认

发送方告诉接收方需要多少数据。接收器读取了那个么多字节,并回答说“我明白了”。然后,发件人可以自由地关闭其连接或继续处理其业务。如果发送方在从接收方收到“我收到了”之前关闭,则数据可能无法到达


至于为什么你的应用程序级别ack不工作,请发布一些代码,我们可以查看一下。

我在System.Net.Sockets.Socket类中没有看到“Flush”方法。@ebyrob和carlos:对不起,它在Stream类中。相应地更改了帖子。我用你的推荐解决了它…到目前为止效果很好!!!谢谢你的提示!主循环的代码很有用,即使是伪代码