【发布时间】:2019-12-23 05:05:06
【问题描述】:
目的
对于这个程序,目的是让一个 html 表单将上传的文件发送到运行 C# 侦听器的服务器。到目前为止,发送文件有效,并且得到处理,但运行文件无法正常工作。
这已缩小到文件末尾似乎缺少的字节。手动添加丢失的字节可以用于测试目的,但对于动态版本不实用。
结果
在一种文件类型中,它是一个错误的页脚,在另一种接受的类型中似乎也是如此。
这是访问发送数据的内容。
TcpListener tcp = new TcpListener(IPAddress.Any, port);
// then the stream...
int read = net.Read(buffer, 0, buffer.Length);
for (int i = 0; i < read ; i++)
bw.Write(buffer[i]);
socket_send($sock, $data, strlen($data), 1);
而发送数据的PHP是在create、connect、send、close中构造的。该文件由 POST 管理,file_get_contents($file) 和 filesize($file) 用于套接字。
问题[更新]
既然数据是作为原始字符串发送的,那么丢失字节的问题是出在发送还是接收的方法上?
缺少数据的原因仍然不确定。它源于使用 PHP 将刚刚上传的文件通过网络发送到另一个目的地。数据缺失的原因是什么?
更新
尝试向读取数据的流添加async 开始/结束。虽然。缺少 char 可能是由于 PHP 套接字使用异常所致。
移动通过 PHP 发送到服务器的上传文件解决了缺少字节/字符的问题,尽管它并不能准确回答为什么缺少数据。
所以问题在于使用 PHP 套接字从服务器本身发送。
【问题讨论】:
-
同步读取可能会错过再见并导致溢出错误。自最初的 8080 PC 以来,每个版本的 Microsoft 操作系统都存在这些问题。解决方案是使用异步事件来读取端口。您的代码还有其他问题。 TCP 最大数据报大小约为 1500 字节。数据报可以在路由期间进行拆分和组合。因此,您的阅读可能不会阅读整个消息。因此,您必须阅读结束字符(如返回)或使用二进制在消息开头包含一个字节数,指示要跟随的字符数。
-
@jdweng 有关“同步读取可能会错过再见并导致溢出错误”的更多详细信息或文档。 ?我真的很好奇。我从来没有遇到过同步读取这样的问题(即使文件非常大且连接速度很慢),并且会对可能出现问题的位置感兴趣。
-
这真的取决于机器上的其他进程。如果其他进程锁定任务切换,您可能会遇到问题。它还取决于缓冲区的大小。与 TCP 相比,串行端口的问题要多得多。但 TCP 数据报最大为 1500 字节,数据报可能采用不同的路由。因此以太网的接收端(在网卡上)必须重新组装接收数据报,以导致不规则的定时。此外,当您因 CRC 错误而重试时,您会得到不规则的时序。慢速连接会降低而不是降低溢出的风险。
标签: c# php .net sockets networkstream