我的理解是TCP被认为是可靠的"因为接收方确认数据包接收,并在有任何问题时请求重新发送。我的文件传输程序当前以32767字节数据包发送文件,尽管我已经尝试了所有大小。发送一个需要340个数据包的10兆字节文件会导致接收器上的三个或四个数据包明显小于发送的数据包。我总是得到一个与原始文件略有不同的文件。
例如,我的日志记录了收到的所有数据包的大小:
TCP packet received (32767 bytes)
TCP packet received (32767 bytes)
TCP packet received (14600 bytes)
TCP packet received (32767 bytes)
我的发送线程以32767字节块的形式读取文件并调用发送子:
MyFile.Read(Buffer, 0, BufferSize)
SendTCPData(Address, Buffer)
我的TCP代码非常简单:
Shared Sub SendTCPData(Address As String, ByVal Data As Byte())
Dim Client As New TcpClient(Address, PortNumber)
Dim Stream As NetworkStream = Client.GetStream()
Stream.Write(Data, 0, Data.Length)
Stream.Close()
Client.Close()
End Sub
有人可以帮忙吗? (帖子" TCP客户端到服务器通信"不处理如何处理收到的数据包大小,这是我的问题。)
答案 0 :(得分:1)
TCP不为应用程序提供数据包接口,而是提供字节流接口。 TCP不会将 not 字节“粘合”在一起,成为消息-它不是消息协议。如果您想要使用TCP读写消息的代码,则必须实际编写或使用其他人的代码来完成。
如果您知道发送方正发送32,767字节,则继续调用TCP接收函数,直到获得32,767字节为止。如果您不知道发件人将要发送多少个字节,或者无法使用某种标记物识别数据的结尾,那么就不可能知道何时获得所有字节。
为了将来,在编写任何网络代码之前,值得花精力来记录将要使用的协议。请查看一些现有协议的一些规范,这些规范可以覆盖TCP上的现有协议(例如SMTP,NNTP,FTP或HTTP),以了解需要决定和记录的内容。
如果要通过TCP发送文件,请仔细查看一些通过TCP发送文件的标准(例如FTP),然后实施该标准或选择该标准的合理子集。至少,阅读该标准将使您大致了解需要使用哪种协议才能完成有效的协议。另外,这对于调试至关重要-如果程序没有标准就无法运行,则由于没有参考可比,因此很难确定是服务器还是客户端出了问题。