【问题标题】:Sockets->program causes missing last character套接字-> 程序导致缺少最后一个字符
【发布时间】: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


【解决方案1】:

问题在于HTML表单完成并将文件上传到服务器后发送数据的阶段。

在 PHP 脚本的 socket_send 部分中设置的标志出错了。

socket_send($sock, $data, strlen($data), 0);

将标志设置为 0,而不是 1,停止截断。

【讨论】:

    【解决方案2】:

    如果文件的大小大于你正在读取文件的缓冲区的大小,那么文件没有完全下载也就不足为奇了——你只读取了一次输入流

    【讨论】:

    • 不太可能。消息更有可能是多次阅读,您必须阅读到消息结束,这可能需要多次阅读。
    • @jdweng 无论如何从输入流中读取一次,依赖于文件适合缓冲区的事实是不正确的 - 他应该在循环中读取流,直到到达流的末尾
    • 你跟我说的其实是一样的
    • 是的,看起来就是这样。有一个重新填充的缓冲区,只是不在问题的代码示例中..
    • @mangusta :您说缓冲区通常比正在读取的数据小很多。这个问题与缓冲区的大小无关。缓冲区通常是临时缓冲区,通常约为 4K 字节。而接收数据可能非常大。
    猜你喜欢
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 2014-07-20
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    相关资源
    最近更新 更多