套接字编程异常XML文档中存在错误(170,46)

时间:2011-11-11 10:43:05

标签: c# sockets buffer

我想通过套接字连接发送对象列表。我知道WCF服务将是一个更好的选择,但它不是我的选择。

我正在使用此代码发送数据

    private void tm_Tick(object sender, EventArgs e)
    {

        XmlSerializer formatter = new XmlSerializer(typeof(List<Objects.PIP>));

        MemoryStream stream = new MemoryStream(1024);

        formatter.Serialize(stream, Repository.GlobalRepository.PIPInformation);

        byte[] bt = stream.ToArray();
        foreach (Communication.Client Client in server.ClientList)
        {
            Client.SendMessage(bt);

        }
        stream.Flush();
    }

    public void SendMessage(Byte[] bytesSent)
    {
        SocketAsyncEventArgs writeEventArgs = new SocketAsyncEventArgs();
        writeEventArgs.SetBuffer(bytesSent, 0, bytesSent.Length);
        socket.SendAsync(writeEventArgs);
    }

似乎工作正常。

接收数据我正在线程上使用此代码。

void ReceiveData()
    {
        try
        {

            while (true)
            {
                if (disposed == true)
                    return;
                data = new byte[socket.ReceiveBufferSize];
                var recv = socket.Receive(data);

                XmlSerializer formatter = new XmlSerializer(typeof(List<Object.PIP>));
                MemoryStream stream = new MemoryStream(data);
                **Classes.TickerInformation.PIPList= (List<Object.PIP>)formatter.Deserialize(stream);**

            }
            socket.Close();
            return;
        }
        catch (Exception ex)
        {

        }

    }

我遇到异常XML文档中存在错误(170,46)。在这一行:  Classes.TickerInformation.PIPList =(List)formatter.Deserialize(stream);

我认为所有数据都没有收到,所以这种情况正在发生。

1 个答案:

答案 0 :(得分:2)

问题是你没有收到整个XML直到最后 - 所以你只序列化XML的初始部分。你必须从套接字读取,直到没有数据。

我建议设置客户端发送的终结符字符串,以便您查找它已完全收到该消息。

请记住,套接字不是基于请求 - 响应。您打开套接字并继续阅读。