丢失字节套接字编程

时间:2010-07-30 14:50:41

标签: c# sockets

我正在开发在两台计算机之间发送和接收数据的应用程序,但是当我发送数据时我遇到的问题是文件大小是4.56 kb但是当我在另一侧接收数据时文件大小减小到1.42 kb并且数据写入文件也完整我的接收字节大小是1024 * 5000.我正在使用c#。我正在使用TCP

这是我的代码

我首先发送数据告诉其他计算机我想要接收哪个文件

 private void GetLoginFile()
    {
        Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            char[] delimiter = splitter.ToCharArray();
            byte[] fileName = Encoding.UTF8.GetBytes(myIP + "_GetLoginFile"); //file name
            byte[] fileData;
            fileData = Encoding.UTF8.GetBytes("null");
            //byte[] fileData = reads.ReadToEnd().to; //file
            byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); //lenght of file name
            clientData = new byte[4 + fileName.Length + fileData.Length];

            fileNameLen.CopyTo(clientData, 0);
            fileName.CopyTo(clientData, 4);
            fileData.CopyTo(clientData, 4 + fileName.Length);
            System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse(serverIP);

            IPEndPoint ipEnd = new IPEndPoint(ipAdd, 9050);
            clientSock.Connect(ipEnd); //target machine's ip address and the port number
            clientSock.Send(clientData);

            byte[] clientData1 = new byte[1024 * 5000];
            string receivedPath = mypath + "XML\\";

            int receivedBytesLen = clientSock.Receive(clientData1);

            int fileNameLen1 = BitConverter.ToInt32(clientData1, 0);

            string fileName1 = Encoding.ASCII.GetString(clientData1, 4, fileNameLen1);
            //string file = Encoding.UTF8.GetString();

            BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + fileName1, FileMode.Append));
            bWrite.Write(clientData1, 4 + fileNameLen1, receivedBytesLen - 4 - fileNameLen1);
            //clientSock.Shutdown(SocketShutdown.Send);

            bWrite.Close();
            clientSock.Close();
        }
        catch (Exception ex)
        {
            clientSock.Close();
            MessageBox.Show(ex.Message);
        }
    }

任何人都可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:3)

好吧,你没有给出任何代码......但我怀疑这是你的接收代码是错误的。

你应该循环,阅读直到流上的Read调用返回0.不要假设你将在一次调用中获得所有数据。

编辑:是的,看看你的收据代码:

int receivedBytesLen = clientSock.Receive(clientData1);

是什么让您认为您已收到该通话中所需的所有数据?您需要循环,接收,直到另一端关闭连接,或者您已阅读所需的所有数据。

答案 1 :(得分:0)

您使用的是UDP套接字吗?如果是这样,那么一切都很好:udp不可靠。使用TCP获取发送的每个字节。