【问题标题】:C# socket image transfer: file sometimes partially transferredC# 套接字图像传输:文件有时会部分传输
【发布时间】:2011-09-22 20:40:46
【问题描述】:

问题

我有PHP 客户端,它将图像文件发送到C# 套接字服务器。我的问题是30%文件被部分传输并停止。

PHP 结束 ->

$file = file_get_contents('a.bmp');
socket_write($socket,$file);

C# 结束 ->

 int l= Socket.Receive(buffer, buffer.Length, SocketFlags.None);
  //create the file using a file stream

我怎样才能在没有中间状态的情况下始终传输完整文件?为什么会这样?

【问题讨论】:

  • 您尝试发送的文件有多大?

标签: c# php sockets


【解决方案1】:

来自Socket.Receive 的文档:

如果您使用的是面向连接的 Socket,则 Receive 方法将读取尽可能多的数据,最多可达 size 参数指定的字节数。如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且已经接收到所有可用数据,则 Receive 方法将立即完成并返回零字节。

这意味着您可能得到少于的总金额。这就是套接字的工作方式。

因此,如果您获得部分阅读,您应该再次致电Socket.Receive。您可以使用Socket.Receive 的重载来继续读入同一个缓冲区。

这里有一篇文章展示了如何“继续阅读”直到你得到你想要的:

如果您不知道数据有多大,则必须继续阅读,直到Socket.Receive 返回零。

【讨论】:

  • hi rick im using int l= Socket.Receive(buffer, buffer.Length, SocketFlags.None); int l 将指定传输的文件大小和创建为l 的长度...这会发生几次:-s
  • 这个想法是停止接收,并每隔 1000 字节左右重新开始,直到套接字接收返回零,这允许您无限期地接收数据(尽管您应该对此设置一个上限,所以没有人可以通过永远向您提供数据来对您的服务器进行 ddos​​)。
  • @Sudantha:即使您知道长度,套接字也可以将数据分段提供给您。使用我提供的链接中的Receive 方法将这些部件重新组装成已知尺寸。
  • 是的,这是真的!以编程方式我如何阻止它?
  • 所有数据将被分解为最大值,即总数据包的 MTU。您总是必须循环读取数据。这就是为什么网络协议有时会在数据之前加上一个大小或以“数据包结束”结构成功。这就是您知道何时停止循环的方式。
猜你喜欢
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 2015-05-16
  • 2011-10-13
  • 2014-10-18
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多