【问题标题】:Sending image over network using sockets, messed up data使用套接字通过网络发送图像,数据混乱
【发布时间】:2012-03-06 19:16:25
【问题描述】:

我在使用套接字通过网络发送以下 140kb 图像文件时遇到问题:

文件的开头被正确传输,然后其余部分变得混乱,导致以下结果:

我有一个等待文件的服务器和一个连接到服务器并启动文件传输的客户端。当客户端关闭连接时,服务器知道文件已经发送完毕并保存。

在写入文件之前,服务器端的所有数据都在字节列表(GLOBAL.FILE_BUFFER)中收集:

public void OnDataReceived(IAsyncResult asyn)
    {
        try
        {
                SocketPacket socketData = (SocketPacket)asyn.AsyncState; 
                int iRx = socketData.m_currentSocket.EndReceive(asyn);

                for (int f = 0; f < iRx; f++)
                {
                    GLOBAL.FILE_BUFFER.Add(socketData.dataBuffer[f]); // Collect all the incoming data into a buffer
                }

                WaitForData(socketData.m_currentSocket, socketData.socket_id, REQUEST_INDEX_ID);
        }
        catch (ObjectDisposedException)
        {

        }
        catch (SocketException se)
        {

        }
    }

这是我用来写入文件的代码:

     public static void ByteArrayToFile(string _FileName, byte[] _ByteArray, int BytesRead)
     {
         System.IO.FileStream _FileStream = new System.IO.FileStream(_FileName,  System.IO.FileMode.Create, System.IO.FileAccess.Write);
         _FileStream.Write(_ByteArray, 0, BytesRead);
         _FileStream.Close();
     }

我在 cient 端使用了相同的 ByteArrayToFile 函数,它正确保存了图像。看起来客户端正在发送正确的数据,但是当服务器收到它时,它就搞砸了。我通过客户端和服务器在两端保存文件,然后比较它们:

注意底部中心的紫色线/条。它表示数据在那里不匹配,但请注意它在开始时完美匹配..

我不明白这怎么会发生,因为我正在使用列表,并且只是继续添加到字节列表中,直到没有任何内容可供阅读!?如果您没有解决方案,您可以给我任何提示吗?这个问题困扰了我好几个星期,很想最终解决它。谢谢!

【问题讨论】:

  • 你验证过你发送的byte[]里面的数据和图片生成的byte[]是一样的吗?贴出生成字节[]的代码
  • @Ramhound 抱歉,我不确定你的意思。客户端从网络上获取图像,然后将其上传到服务器。当我从 httpwebresponse 收集客户端字节列表中的所有数据时,我保存图像,以验证它是否有效并且它被保存并工作。如果这是您的问题,请告诉我。谢谢!

标签: c# image sockets transfer


【解决方案1】:

您能从您的数据比较中看出问题所在吗?服务器是简单地丢弃字节还是数据已损坏?正确传输了多少数据?

考虑使用Wireshark 之类的东西来检查从线路上脱落的字节。这应该可以帮助您确定是网络错误还是服务器代码中的问题。

【讨论】:

  • 感谢您的建议。据我所知,前 40% 被正确传输,然后从那里大部分数据被弄乱了,而不是简单地分段(比如前 1024 个字节好,然后剩下的乱七八糟),但它在字节级别上被弄乱了,比如 10 个字节好, 两个字节不匹配等..
  • 另外,如果我使用更大的图像进行测试,则正确发送的百分比较小,其余的则一团糟。几乎看起来第一段(1024字节)总是完美的,但后来它搞砸了,这很奇怪..
  • 您可能想在收到数据包时尝试打印接收缓冲区大小 (iRx)。如果这与数据损坏的开始点相关,那么您可能在复制到文件缓冲区时丢弃了数据。
猜你喜欢
  • 2010-11-07
  • 2015-07-28
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 2015-12-02
  • 2011-04-11
相关资源
最近更新 更多