使用套接字通过网络发送图像,混乱的数据

时间:2012-03-06 19:16:25

标签: c# image sockets transfer

我无法使用套接字通过网络发送以下140kb图像文件:

original image

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

messed up image

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

在写入文件之前,服务器端的所有数据都在字节列表(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函数,它正确地保存了图像。看来客户端正在发送正确的数据,但是当服务器收到它时,它就会搞砸了。我通过客户端和服务器在两端保存文件,然后对它们进行比较:

enter image description here

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

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

1 个答案:

答案 0 :(得分:1)

您能从数据比较中判断问题是什么吗?服务器是丢弃字节还是数据损坏?正确传输了多少数据?

考虑使用像Wireshark这样的东西来检查它们脱离线路时的字节。这应该可以帮助您确定它是网络错误还是服务器代码中的某些内容。