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

C# 使用套接字通过网络发送图像,混乱的数据,c#,image,sockets,transfer,C#,Image,Sockets,Transfer,我在使用套接字通过网络发送以下140kb图像文件时遇到问题: 文件的开头被正确传输,其余部分则被打乱,导致以下结果: 我有一个等待文件的服务器和一个连接到服务器并启动文件传输的客户端。当客户端关闭连接时,服务器知道文件已发送完毕并保存 在写入文件之前,服务器端的所有数据都收集在字节列表(GLOBAL.FILE\u BUFFER)中: public void OnDataReceived(IAsyncResult asyn) { try {

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

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

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

在写入文件之前,服务器端的所有数据都收集在字节列表(GLOBAL.FILE\u 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函数,它正确地保存了图像。客户机似乎正在发送正确的数据,但当服务器接收到数据时,它就会出错。我在两端按客户端和服务器保存了文件,然后比较了它们:

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


我不明白为什么会发生这种情况,因为我使用的是列表,只是一直添加到字节列表中,直到没有任何内容可以读取!?如果你没有办法,你能给我一些建议吗?!这个问题困扰了我好几个星期,我很想最终解决它。谢谢

你能从数据对比中看出问题所在吗?服务器只是在删除字节,还是数据已损坏?正确传输了多少数据


考虑使用类似的方法在字节脱离连接时检查它们。这将帮助您确定这是网络错误还是服务器代码中的某个错误。

您能从数据比较中看出问题所在吗?服务器只是在删除字节,还是数据已损坏?正确传输了多少数据


考虑使用类似的方法在字节脱离连接时检查它们。这将帮助您确定是网络错误还是服务器代码中的某个错误。

您是否验证了发送的字节[]中的数据与映像生成的字节[]相同?发布生成字节[]@Ramhound的代码对不起,我不知道你的意思。客户端从web获取图像,然后将其上载到服务器。当我从httpwebresponse收集客户端字节列表中的所有数据时,我保存了该图像,以验证它是否有效,它是否被保存并工作。如果这是你的问题,请告诉我。谢谢您是否已验证发送的字节[]中的数据与图像生成的字节[]相同?发布生成字节[]@Ramhound的代码对不起,我不知道你的意思。客户端从web获取图像,然后将其上载到服务器。当我从httpwebresponse收集客户端字节列表中的所有数据时,我保存了该图像,以验证它是否有效,它是否被保存并工作。如果这是你的问题,请告诉我。谢谢谢谢你的建议。据我所知,前40%的数据被正确地转换,然后大部分数据被弄乱了,不仅仅是在片段中(比如前1024个字节正常,然后是剩余的字节),而是在字节级别上弄乱了,比如10个字节正常,两个字节不匹配等等。另外,如果我用更大的图像进行测试,一小部分被正确发送,其余部分被弄乱。似乎第一个段(1024字节)总是完美的,但之后它会把它搞砸,这很奇怪。当你收到一个数据包时,你可能想尝试打印接收缓冲区大小(
iRx
)。如果这与数据损坏的开始点相关,那么您可能在复制到文件缓冲区时删除了数据。谢谢您的建议。据我所知,前40%的数据被正确地转换,然后大部分数据被弄乱了,不仅仅是在片段中(比如前1024个字节正常,然后是剩余的字节),而是在字节级别上弄乱了,比如10个字节正常,两个字节不匹配等等。另外,如果我用更大的图像进行测试,一小部分被正确发送,其余部分被弄乱。似乎第一个段(1024字节)总是完美的,但之后它会把它搞砸,这很奇怪。当你收到一个数据包时,你可能想尝试打印接收缓冲区大小(
iRx
)。如果这与数据损坏的开始点相关,则可能是在复制到文件缓冲区时删除数据。