2012-03-06 72 views
1

我在传送如下因素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

请注意,在底部中央的紫线/条。这表明,数据不匹配存在,但是请注意,在一开始完全吻合..

我不明白怎么能这样呢,因为我使用的名单,只是不断增加的字节列表,直到有没有什么可读的!?如果你没有解决方案,你可以给我任何提示吗?!这个问题一直困扰着我好几个星期,希望能够把它弄清楚。谢谢!

+0

你有没有在你发送相同的图像生成的字节[]字节[]数据验证?发布生成字节的代码[] – 2012-03-06 19:26:50

+0

@Ramhound对不起,我不确定你的意思。客户端从Web上获取图像,然后将其上传到服务器。当我从httpwebresponse的客户端的字节列表中收集所有的数据时,我保存图像,验证它是否有效,并保存并运行。请让我知道,如果这是你的问题。谢谢! – user1192403 2012-03-06 19:29:52

回答

1

你能从你的数据比较的问题是什么告诉?服务器是简单地丢失字节还是数据损坏?多少数据传输正确?

考虑使用像Wireshark的东西,因为他们来了电线检查字节。这应该可以帮助您确定它是否是网络错误或您的服务器代码中的某些内容。

+0

感谢您的建议。从我可以告诉最初的40%得到正确transfared,然后从那里大部分数据是乱七八糟,而不是简单地在段(如前1024个字节确定,然后休息乱),但它得到弄糟在字节级,像10个字节确定,两个字节不匹配等。 – user1192403 2012-03-06 19:33:38

+0

另外,如果我有一个较大的图像测试,一个较小的比例被正确发送,其余的是乱七八糟。几乎看起来像第一个段(1024字节)总是完美的,但之后它会混淆起来,这很奇怪。 – user1192403 2012-03-06 19:34:48

+0

当你得到一个包时,你可能想要尝试打印接收缓冲区大小('iRx')。如果这与数据损坏开始的点相关,则可能在复制到文件缓冲区时丢弃数据。 – TMN 2012-03-06 19:52:35

相关问题